如何覆盖Rails模型中的列?

我有一个我的数据库表的模型。 我想覆盖该特定表的列名。 我怎么做到这一点。

例如,让我的表被称为DUMMY,它有一个名为col_a

 col_a 20 34 42 23 12 

我会做@dummy.col_a 。 现在这个方法应该返回0表示以0结尾的数字,对于其他一切,它应该返回原始值。 我可以通过定义一个新方法来做到这一点,但我想覆盖列名本身。 请帮忙。

您可以覆盖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是一个整数。)

您可以通过覆盖默认访问器来实现这一点,如文档中所述。 所有列值都可以通过Active Record对象上的基本访问器自动获得,但有时您希望专门化此行为。 这可以通过覆盖默认访问器(使用与属性相同的名称)并调用read_attribute(attr_name) )和read_attribute(attr_name) write_attribute(attr_name, value)来实际更改内容。

滚动到覆盖默认访问者部分以获取更多信息。

我在这里参加派对有点晚了,但是一个非常优雅的方法是简单地使用super

 class Dummy < ApplicationRecord def col_a super % 10 === 0 ? 0 : super end end