Как вложить модели в модель - PullRequest
1 голос
/ 17 июля 2011

Представьте, что у меня две модели

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

Actor
-name
-d_o_b
-biography
-films

Актеры вложены в фильм и наоборот.

Как мне представить эти отношения в моих моделях Ruby?Реально у меня будет третье отображение таблицы actor_id с film_id.

Добавляя детали к фильму, я хотел бы иметь возможность создавать актера на лету (если актер не существует, создайте нового с указанным именем)

Спасибоadvance.

ADDITION :

Только что нашел ссылку на похожий вопрос .

1 Ответ

3 голосов
/ 17 июля 2011

Вы смотрите на отношения между двумя таблицами: "Имеет и принадлежит многим" (HABTM).Прочитайте об отношениях HABTM в руководствах по Rails здесь: 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 - хотя он старый, он все равно должен применяться.Кроме того, вы можете использовать драгоценный камень, такой как Простая форма , чтобы легко сгенерировать ассоциации для вас, например, так:

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