2011-05-06 45 views
10

我有一个我的数据库表模型。我想覆盖该特定表的列名称。我将如何实现它。如何覆盖Rails模型中的列?

例如,让我的表称为模拟,它有一个名为col_a

col_a 
20 
34 
42 
23 
12 

我会做一个@dummy.col_a一列。现在这个方法应该返回给我的结尾为0的数字和其他所有的数字,它应该返回原始值。我可以通过定义一个新方法来实现,但我想重写列名称本身。请帮忙。

回答

22

您可以覆盖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 
9

您可以简单地定义一个与该列同名的方法。要获取实际列值,请使用self [column_name]。所以,这样的事情应该工作:

class Dummy < ActiveModel::Base 
    def col_a 
    self[:col_a] % 10 == 0 ? 0 : self[:col_a] 
    end 
end 

(假设为col_a是一个整数)。

+0

,应该是'自我[:为col_a]!%10 = 0? self [:col_a]:0'或'(self [:col_a]%10).zero? ? 0:self [:col_a]' – fl00r 2011-05-06 10:17:02

+0

是的 - 我假设0在这里评估为false,但它不。固定。 – Thilo 2011-05-06 10:20:37

4

可以实现通过overwriting default accessors如文档中描述的。所有列值都可以通过Active Record对象上的基本访问器自动获得,但有时需要专门化这种行为。这可以通过覆盖默认访问器(使用与属性相同的名称)并调用read_attribute(attr_name)write_attribute(attr_name, value)实际改变内容来完成。

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

0

我有点迟到了这里,但一个非常优雅的方式来做到这一点是简单地使用super

​​