
我有一个模型,看起来像这样:
class At::ModalityCombo < Base
self.table_name = 'at_modalites_at_combos'
belongs_to :at_modality, :class_name => 'At::Modality', foreign_key: :modality_id
belongs_to :at_combo, :class_name => 'At::Combo', foreign_key: :combo_id
attr_reader :modality_day
attr_writer :modality_day
endmodality_day列的迁移类似于:
class AddDayInModalityCombo < ActiveRecord::Migration[5.2]
def up
add_column :at_modalites_at_combos, :modality_day, :integer, default: 0
end
def down
remove_column :at_modalites_at_combos, :modality_day
end
end在rails控制台上,
abc = At::ModalityCombo.new
abc.modality_day = 4
abc输出:
modality_id: nil, combo_id: nil, modality_day: 0为什么modality_day仍然是0?
发布于 2020-01-06 19:00:26
我觉得你把铁轨弄糊涂了。
modality_day的列。这使您可以在At::ModalityCombo实例上读取/写入该属性。attr_reader和attr_writer设置了modality_day。看起来attr_writer/attr_reader正在覆盖通常允许您管理数据库中定义的属性的方法。删除这些应该修复这个问题,并使它像您所期望的那样工作。
attr_reader :modality_day基本上相当于:
def modality_day
@modality_day
endattr_writer :modality_day基本上相当于:
def modality_day=(value)
@modality_day = value
end这些方法管理实例变量,但Active Record不以这种方式存储数据库数据。
发布于 2020-01-07 00:30:17
attr_reader、attr_writer和attr_accessor不应该在Rails模型中使用(至少在Rails 5.0+中不应该使用)。它们是内置于元编程方法中的Rubys,用于创建setter和getter。
ActiveRecord实际上直接从db读取模式,并创建与db表中的列对应的特殊设置器和getter。这些设置是从基本的attr_writer设置光年-他们做类型铸造,肮脏跟踪等。
如果您使用attr_accessor,您将覆盖setter,并且您的模型将停止持久化属性。
对于未保存到数据库的“虚拟属性”,请使用属性api进行默认值和类型转换。
https://stackoverflow.com/questions/59617005
复制相似问题