我遇到了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
一切都按预期工作。虽然有点冗长,但我想这在技术上更准确。
答案 0 :(得分:1)
我建议使用
Document.build(:account_id => current_account.id, :descriptions => [desc])