Вопрос о правильных ассоциациях в Rails - PullRequest
1 голос
/ 07 августа 2011

Возьмем, к примеру, эту ситуацию.

У вас есть 3 модели:

  1. Поэт - Представляет автора стихотворения
  2. Поэма - представляет стихотворение, написанное поэтом
  3. Печать - представляет собой печатную публикацию любого рода, содержащую поэму поэмы.

Сразу поэт и поэма очевидны:

  • Поэт has_many Стихи
  • Поэма belongs_to Поэт

Меня сбивает с толку, когда я имею дело с моделью Printing.

В этом случае типография в некотором смысле принадлежит как поэту, так и поэме. Вы могли бы сказать, что у поэта есть много печатных изданий или у поэмы есть много печатных изданий, что имеет смысл, но идти по обратному пути сложно ...

А как насчет ситуации, когда в каком-то журнале или книге печаталось 5 стихов одного поэта? ИЛИ, одно из стихов опубликовано в 10 разных журналах?

Кажется, что сама печать "принадлежит многим" стихам или поэтам. Я знаю, что это неправильно, но я просто пытаюсь сформулировать суть.

Итак, ответный вопрос таков: Как бы вы создали эти отношения? В частности, как будет выглядеть модель и таблица базы данных И как вы будете использовать их для доступа к связанным данным?

Спасибо!

1 Ответ

2 голосов
/ 07 августа 2011

А как насчет ситуации, когда в каком-то журнале или книге напечатаны 5 стихов одного поэта?

Помните, если у вас есть поэт, у которого много стихов, и у вас есть много стихотворений, вывсегда можно получить поэта.

Poet.poems.first.printings вернет все печатные издания первого стихотворения поэтов

, или вы можете сделать Printing.poems.first.poet Таким образом, вы могли быполучить поэта первого стихотворения в печати. ​​

Как бы вы установили эти отношения?В частности, как будет выглядеть модель и таблица базы данных И как вы будете использовать их для доступа к связанным данным?

Я бы настроил это следующим образом

Poet :has_many poems
poem :belongs_to poet
poem :has_and_belongs_to_many printings
printing :has_many poems

Поскольку выиспользуя ассоциацию has_and_belogs_to_many, вам нужна таблица объединения, для стихов и печатных изданий

у вас будет миграция, которая выглядит следующим образом

CreatePoemsPrintingJoinTable < ActiveRecord::Migration
  def self.up
    create_table :poems_printings, :id => false do |t|
      t.integer :poem_id
      t.integer :printing_id
    end
  end

  def self.down
    drop_table :poems_printings
  end
end

Другие таблицы довольно просты

CreateTablePoems < ActiveRecord::Migration
  def self.up
    create_table :poems, do |t|
    t.integer :poet_id
    end
  end

  def self.down
    drop_table :poems
  end
end

CreateTablePoets < ActiveRecord::Migration
  def self.up
    create_table :poets do |t|
    end
  end

  def self.down
    drop_table :poems
  end
end

CreateTablePrintings < ActiveRecord::Migration
  def self.up
    create_table :printings do |t|
    end
  end

  def self.down
    drop_table :printings
  end
end
...