当我在Rails中实例化对象时如何初始化属性?

nfm*_*nfm 2 attributes model initialization ruby-on-rails dry

Clients有很多Invoices.发票具有number我想通过递增客户的先前发票号来初始化的属性.

例如:

@client = Client.find(1)
@client.last_invoice_number
> 14
@invoice = @client.invoices.build
@invoice.number
> 15
Run Code Online (Sandbox Code Playgroud)

我希望将此功能纳入我的Invoice模型中,但我不确定如何操作.这就是我想象的代码:

class Invoice < ActiveRecord::Base
  ...
  def initialize(attributes = {})
    client = Client.find(attributes[:client_id])
    attributes[:number] = client.last_invoice_number + 1
    client.update_attributes(:last_invoice_number => client.last_invoice_number + 1)
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,我打电话时attributes[:client_id] 没有设置@client.invoices.build.

发票的client_id初始化方式和时间,以及何时可以使用它来初始化发票number?我可以将这个逻辑放入模型中,还是必须将其放入控制器中?

Eim*_*tas 7

生成将invoices_number列添加到users表的迁移.然后在Invoice模型中写这个:

class Invoice < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
  ...
end
Run Code Online (Sandbox Code Playgroud)

invoices_count创建发票后,这将自动增加用户的属性.


Pat*_*ann 5

这个怎么样:

class Invoice < ActiveRecord::Base
  ...
  def initialize(attributes = {})
    super
    self.number = self.client.invoices.size + 1 unless self.client.nil?
  end
end
Run Code Online (Sandbox Code Playgroud)

  • after_initialize是一个没有广泛记录或使用的回调,与我以前的评论极为相关! (4认同)