时间:2011-07-16 21:37:03

标签: ruby-on-rails model one-to-many

想象一下,我有两个模型

Film
-name
-description
-duration
-year_made
-rating
-actors

Actor
-name
-d_o_b
-biography
-films

演员嵌套在电影中,反之亦然。

我如何在Ruby模型中表示这种关系?实际上,我会有第三个表格actor_idfilm_id

在为电影添加细节的同时,我希望能够动态创建一个演员(如果演员不存在则创建一个提供名称的新演员)

提前谢谢。

ADDITION

刚刚找到similar question的链接。

1 个答案:

答案 0 :(得分:3)

您正在查看两个表之间的Has和Belut to Many(HABTM)关系。 请阅读Rails指南中的HABTM关系:http://edgeguides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference

首先,您需要生成一个类似于以下内容的迁移:

class AddActorFilmTable < ActiveRecord::Migration
  def self.up
    create_table :actors_films, :id => false  do |t|
      t.integer :actor_id, :null => :false
      t.integer :film_id, :null => :false
    end
    add_index :actors_films, [:actor_id, :film_id], :unique => true
  end

  def self.down
    drop_table :actors_films
  end
end

然后在模型中指定:

class Actor < ActiveRecord::Base
  has_and_belongs_to_many :films
end

class Film < ActiveRecord::Base
  has_and_belongs_to_many :actors
end

这将允许您为此类关系使用所有其他Rails方法。要在表单中使用此功能,您可以关注RailsCast 17: HABTM Checkboxes - 虽然它已经过时,但它仍然适用。或者,您可以使用像Simple Form这样的宝石轻松为您生成关联:

form_for @actor do |f|
    f.collection_check_boxes :film_ids, Film.all, :id, :name
end