0

在 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没有被持久化到数据库中?

4

1 回答 1

0
  1. 鉴于您提供的代码没有理由为什么您应该覆盖该ActiveRecord::Base.initialize方法。这通常是不好的做法。setter on@user并且@template根本没有必要;Rails 将通过基本的初始化方法为您设置模型属性。
  2. 设置器的默认功能@text应该在一个after_initialize块中提供

    after_initialize do
      self.text = self.template if self.text.blank? && self.template.present?
    end
    
  3. 如果:text确实是模型属性(匹配数据库中的列),则不应调用attr_accessor :text模型Message。它对你没有好处,并且会覆盖和方法ActiveRecord::Base的功能。texttext=

于 2013-07-05T03:27:24.063 回答