Rails Join Table с моделью Assoc

У меня есть модель, которая опирается на ассоциации двух других моделей, например:

class InventoryItem < ActiveRecord::Base
  attr_accessible :vendor_id, :price, :upc
  has_many :items
  belongs_to :vendor
end

Мой вопрос заключается в следующем: если у меня есть эти ассоциации в модели соединения, нужно ли мне снова указывать эти ассоциации в миграции, чтобы создать таблицу inventory_items, чтобы она включала атрибуты из :items и :vendor? Вот текущая миграция (еще не запущенная) для создания этой таблицы:

class CreateInventoryItems < ActiveRecord::Migration
  def change
    create_table :inventory_items do |t|
      t.integer :upc
      t.decimal :price
      t.integer :vendor_id
    end
  end
end

Просмотр базы данных sqlit3 заставляет меня поверить, что мне нужно как-то это сделать. Лучший способ сделать это? Я новичок в RoR, поэтому любые отзывы приветствуются и ценятся.


person settheline    schedule 21.07.2013    source источник


Ответы (1)


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

С Rails идея состоит в том, чтобы делать как можно меньше на уровне базы данных и как можно больше на уровне приложения (ORM). Поэтому вы сообщаете моделям об ассоциациях, что позволяет им использовать соответствующие методы ORM для обработки ассоциаций, но вашей базе данных не нужно знать об ассоциациях.

person weltschmerz    schedule 21.07.2013
comment
Спасибо, это в основном имеет смысл. Будут ли атрибуты из :vendor и :item отражаться в моей таблице соединений "inventory_items" даже без указания ассоциаций при миграции? Возможно, лучше задать следующий вопрос: необходимо ли, чтобы атрибуты :vendor и :item отражались в таблице соединений «inventory_items», чтобы получить к ним доступ в моем приложении? - person settheline; 21.07.2013
comment
Для ассоциаций «принадлежит_кому» вам нужен внешний ключ, например vendor_id. Кроме того, просто установите ассоциации в своей модели, этого достаточно. Тогда вы сможете делать такие вещи, как InventoryItem.items.first и InventoryItem.first.vendor. Ваша миграция выше должна работать нормально. - person weltschmerz; 21.07.2013