我有一个数据库表的模型 . 我想覆盖该特定表的列名 . 我将如何实现它 .
例如,让我的表被称为DUMMY,它有一个名为 col_a 的列
col_a
col_a 20 34 42 23 12
我会做 @dummy.col_a . 现在这个方法应该返回0表示以0结尾的数字,对于其他一切,它应该返回原始值 . 我可以通过定义一个新方法来做到这一点,但我想覆盖列名本身 . 请帮忙 .
@dummy.col_a
您可以覆盖 col_a 方法 . 使用read_attribute方法读取数据库中的值 . 像这样的东西:
def col_a if self.read_attribute(:col_a).to_s.end_with?('0') 0 else self.read_attribute(:col_a) end end
您只需定义与列名称相同的方法即可 . 要获取实际列值,请使用self [column_name] . 所以像这样的东西应该工作:
class Dummy < ActiveModel::Base def col_a self[:col_a] % 10 == 0 ? 0 : self[:col_a] end end
(这假设col_a是一个整数 . )
您可以按照文档中的说明通过_2817123实现 . 所有列值都可以通过Active Record对象上的基本访问器自动获得,但有时您希望专门化此行为 . 这可以通过覆盖默认访问器(使用与属性相同的名称)并调用 read_attribute(attr_name) 和 write_attribute(attr_name, value) 来实际更改内容来完成 .
read_attribute(attr_name)
write_attribute(attr_name, value)
滚动到覆盖默认访问者部分以获取更多信息 .
我在这里参加派对有点晚了,但是一个非常优雅的方法是简单地使用 super
super
class Dummy < ApplicationRecord def col_a super % 10 === 0 ? 0 : super end end
4 回答
您可以覆盖
col_a
方法 . 使用read_attribute方法读取数据库中的值 . 像这样的东西:您只需定义与列名称相同的方法即可 . 要获取实际列值,请使用self [column_name] . 所以像这样的东西应该工作:
(这假设col_a是一个整数 . )
您可以按照文档中的说明通过_2817123实现 . 所有列值都可以通过Active Record对象上的基本访问器自动获得,但有时您希望专门化此行为 . 这可以通过覆盖默认访问器(使用与属性相同的名称)并调用
read_attribute(attr_name)
和write_attribute(attr_name, value)
来实际更改内容来完成 .滚动到覆盖默认访问者部分以获取更多信息 .
我在这里参加派对有点晚了,但是一个非常优雅的方法是简单地使用
super