如何覆盖Rails模型中的列?

bra*_*boy 14 ruby activerecord overriding model ruby-on-rails

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

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

col_a
20
34
42
23
12
Run Code Online (Sandbox Code Playgroud)

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

hta*_*ata 32

您可以覆盖该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
Run Code Online (Sandbox Code Playgroud)


Thi*_*ilo 9

您只需定义与列名称相同的方法即可.要获取实际列值,请使用self [column_name].所以像这样的东西应该工作:

class Dummy < ActiveModel::Base
  def col_a
    self[:col_a] % 10 == 0 ? 0 : self[:col_a]
  end
end
Run Code Online (Sandbox Code Playgroud)

(这假设col_a是一个整数.)


dph*_*ner 8

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

class Dummy < ApplicationRecord
  def col_a
    super % 10 === 0 ? 0 : super
  end
end
Run Code Online (Sandbox Code Playgroud)


Sye*_*lam 5

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

滚动到覆盖默认访问器部分了解更多信息。