在Rails 4中,我有一个与user
和template
有关系的消息模型。它还有自己的属性text
。
class Message < ActiveRecord::Base
attr_accessor :text
belongs_to :user
belongs_to :template
validates :user, presence: true
validates :template, presence: true
validates :text, presence: true, if: lambda { |message| message.template.present? }
def initialize(args = {})
super
@user = args[:user]
@template = args[:template]
@text = args[:text] || (args[:template].text if args[:template].present?)
end
end
这是我的问题:
(假设我已经user
和template
了
当我运行message = Message.create!(user: user, template: template, "hello world")
时
message.text
将等于"hello world"
,但是当我从数据库中检索此记录时,text
属性为nil
,所有其他属性都可以。
是什么给出的?为什么text
没有被持久化到数据库?
答案 0 :(得分:0)
ActiveRecord::Base.initialize
方法。这通常是不好的做法。 @user
和@template
上的设定者根本不需要; Rails将通过基本初始化方法为您设置模型属性。您应该在@text
块中提供after_initialize
setter的默认功能
after_initialize do
self.text = self.template if self.text.blank? && self.template.present?
end
如果:text
确实是模型属性(与数据库中的列匹配),则不应在attr_accessor :text
上调用Message
模型。它对您没有任何好处,并会覆盖ActiveRecord::Base
和text
方法的text=
功能。