我有一个数据库表的模型,我想覆盖该特定表的列名。我应该如何实现?
例如,让我的表称为DUMMY,并且它有一个名为col_a
的列。
col_a
20
34
42
23
12
我将执行 @dummy.col_a
。现在这个方法应该对以0结尾的数字返回0,对于其他所有情况,它应该返回原始值。我可以通过定义一个新方法来实现,但我想覆盖列名本身。请帮忙。我有一个数据库表的模型,我想覆盖该特定表的列名。我应该如何实现?
例如,让我的表称为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 是整数。)
self[:col_a] % 10 != 0 ? self[:col_a] : 0
或者 (self[:col_a]%10).zero? ? 0 : self[:col_a]
。 - fl00r我来晚了,但是一个非常优雅的方法是简单地使用 super
class Dummy < ApplicationRecord
def col_a
super % 10 === 0 ? 0 : super
end
end
read_attribute(attr_name)
和write_attribute(attr_name, value)
来实际更改内容来完成。
def attribute_name=(value) self.write_attribute(value) end
此外,检查其他答案以查看自2017年以来是否可以使用super
代替read_attribute
、write_attribute
。 - nilsandrey