如何创建将与两个父模型关联的模型

时间:2013-09-11 20:06:08

标签: ruby-on-rails model polymorphic-associations model-associations polymorphism

我是铁杆新手,仍在学习这些联想,而且我一直坚持模特关系。

我有一个我希望与两个父模型相关联的模型,以便在创建该模型的实例时,它会自动与两个父模型相关联。我不确定这是否是一种多态关系。如果是,有人可以告诉我如何处理创建,以便它创建正确的链接。我不是从文档中获得多态关系。

目前我正在使用一个模型进行创建并将条目添加到另一个模型。我想有一种方法可以让它自动发生,但我不知道该怎么做。

当前实施:

entry = @pool.entries.create(new_entry_params)
current_user.entries << entry
current_user.save

我想以这种方式进行设置,以便我可以轻松地从用户实例和池实例中显示特定用户的所有条目。

以下是我目前为模型/数据库设置所做的事情:

型号:

class User < ActiveRecord::Base
   has_many :pools, through: :pool_memberships, dependent: :destroy
   has_many :entries, dependent: :destroy
end

class Pool < ActiveRecord::Base
   has_many :users, through: :pool_memberships, dependent: :destroy
   has_many :entries, dependent: :destroy
end

class Entry < ActiveRecord::Base
  belongs_to :user
  belongs_to :pool
end

条目迁移表:

class CreateEntries < ActiveRecord::Migration
  def change
    create_table :entries do |t|
      t.references :pool, index: true
      t.references :user, index: true
      t.string :name
      t.integer :pool_id
      t.integer :user_id, index: true

      t.timestamps
    end
  end
end

这是“Rails”这样做的方式吗?或者我离开基地了。谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

首先,您不需要current_user.save,因为您没有修改current_user对象。 :)

这应该可以解决问题:

@pool.entries.create(new_entry_params.merge(:user_id => current_user.id))

答案 1 :(得分:0)

在ActiveRecord中,多态关系是模型可能具有多个可能父项之一的关系,但它仍然只有一个父项。它是多态的,因为你不知道父类的类型,但你应该可以互换地对待它们。但由于你希望你的模型同时拥有两个父母,这不是你想要的。

您的实现看起来很好,但没有理由调用current_user.save。测试一下,你会发现在这种情况下&lt;&lt; operator实际上会在连接表中触发数据库插入。