1

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

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

有什么建议么?

4

1 回答 1

0

使用build在内存中创建一个新的联系人实例,但您需要手动设置account_id记录(例如@contact.account_id = current_user.account.id),或者可能将其设置在new用于显示联系人的表单中的隐藏字段中,以便在传递给build方法的 params 数组。

您可能还想考虑accepts_nested_attributes_for在这种情况下是否有帮助。另一种选择可能是使用delegate,尽管在这两种情况下,您的使用可能与它们的用途相反(通常在“父级”上定义)。

更新:在您的情况下,该build方法被添加到用户实例和帐户(可能是“所有者”)实例中,因为您在用户和联系人之间具有多对多关系,以及一对多关系- 帐户和联系人之间的许多关系。所以要得到account_id我认为你需要调用帐户的构建,比如

@contact = current_user.accounts.contacts.build(params[:contact])

这行得通吗?

于 2012-11-30T14:35:40.220 回答