在Rails 4.1.1中集合`build`方法记录实例化的问题

时间:2014-05-27 05:25:36

标签: ruby-on-rails ruby-on-rails-4

我遇到了Rails collection.build(attrs)方法的问题,特别是框架如何实例化新记录。例如,这是我的模型的简化视图:

class Document < ActiveRecord::Base
  belongs_to :account
  has_many :descriptions, before_add: :id_test
  validates :account, presence: true
  def id_test
    puts self.account_id
  end
end

当我做类似的事情时:

current_account.documents.build(:descriptions => [desc])

然后id_test什么都不打印。也就是说,account_id回调中没有设置before_add(是的,我也尝试了after_add回调;在这种情况下,account_id也没有设置)。

如果我这样做:

d = current_account.documents.build
d.assign_attributes(:descriptions => [desc])

然后一切都按预期工作。但是,我更喜欢更好的替代方案,因为在控制器中实现这将是一件痛苦的事情......

有没有办法让Rails首先添加foreign_key,还是有更好的方法来设置它?我没有回去检查确定,但这似乎与Rails 3评估collection.build语句的方式不同。

修改

稍微查看一下Rails代码,我发现我可以做到:

current_account.documents.build do |record|
  record.assign_attributes(:descriptions => [desc])
end

一切都按预期工作。虽然有点冗长,但我想这在技术上更准确。

1 个答案:

答案 0 :(得分:1)

我建议使用

Document.build(:account_id => current_account.id, :descriptions => [desc])