has_many:通过和构建

时间:2012-11-30 14:24:04

标签: ruby-on-rails-3 activerecord

我有三个模型,帐户,用户和联系人:

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返回一个空的集合。

有什么建议吗?

1 个答案:

答案 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])

这有用吗?