我有三个模型,帐户,用户和联系人:
class User < ActiveRecord::Base
has_one :account
has_many :contacts, :through => :account
end
class Account < ActiveRecord::Base
belongs_to :owner, :class_name => 'User'
has_many :contacts
end
class Contact < ActiveRecord::Base
belongs_to :account
end
我正在尝试通过用户记录构建一个新的联系人,就像在我的联系人控制器中一样。
def create
@contact = current_user.contacts.build(params[:contact])
respond_to do |format|
if @contact.save
...
else
...
end
end
end
当我这样做时,我没有收到任何错误,联系人记录被保存到数据库,但是联系人没有设置account_id列,并且没有将其添加到集合中,因此调用@ current_user.contacts返回一个空的集合。
有什么建议吗?
答案 0 :(得分:0)
使用build
在内存中创建一个新的Contact实例,但您需要在记录上手动设置account_id
(例如@contact.account_id = current_user.account.id
),或者将其设置为隐藏new
形式的字段,用于显示创建的联系人,以便在传递给build
方法的params数组中拾取它。
您可能还想考虑accepts_nested_attributes_for
在这种情况下是否有用。另一种选择可能是使用delegate
,尽管在这两种情况下,您的使用可能与这些目的相反(通常在“父”上定义)。
更新:
在您的情况下,build
方法被添加到用户实例和帐户(可能是“所有者”)实例,因为您在用户和联系人之间存在多对多关系,以及帐户和联系人之间的一对多关系。所以要获得account_id
我认为你需要调用Account的构建,比如
@contact = current_user.accounts.contacts.build(params[:contact])
这有用吗?