2013-10-24 3 views
1

У меня две модели, FlyerItem и Product. Если вы думаете о флаеере для магазина электроники, он может показать телевизор в продаже. В этом конкретном случае я предполагаю, что элемент флаера рекламирует один продукт.Какая подходящая ассоциация для объединения двух несвязанных моделей

Я определил модель для элемента летающего как этот

class FlyerItem < ActiveRecord::Base 
    has_one :product 
end 

миграция выглядит как этот

class CreateFlyerItems < ActiveRecord::Migration 
    def change 
    create_table :flyer_items, :primary_key => :flyer_item_id do |t| 
     t.references :product 
    end 
    end 
end 

Тогда на мой взгляд, я пытаюсь получить доступ к конкретному экземпляру элемента, как этот

<% FlyerItem.find do |item| %> 
    <p><%= item.product %></p> 
<% end %> 

Однако рельсов генерирует исключение

PG::UndefinedColumn: ERROR: column products.flyer_item_id does not exist 
LINE 1: SELECT "products".* FROM "products" WHERE "products"."flye... 
                ^
: SELECT "products".* FROM "products" WHERE "products"."flyer_item_id" = $1 ORDER BY "products"."product_id" ASC LIMIT 

Ожидается, что продукт действительно не имеет никакого отношения к элементу флаера, поэтому таблица Product не имеет и не должна иметь этот столбец.

То, что я действительно хочу сказать что-то вроде

SELECT * FROM flyer_items WHERE flyer_items.product_id = products.product_id

Какие ассоциации я бы использовать здесь?
Является ли ассоциация даже правильным подходом?

Буклет должен иметь один продукт, но продукт не обязательно должен быть привязан к любым листовки.

ответ

1

Вместо has_one вы хотите belongs_to. Метод ассоциации belongs_to относится к классу с столбцом внешнего ключа. На противоположной стороне ассоциации вы можете использовать has_many или has_one в зависимости от ваших потребностей.

class FlyerItem < ActiveRecord::Base 
    belongs_to :product 
end 

class Product < ActiveRecord::Base 
    has_many :flyer_items 
end 
+0

Спасибо! Я думаю, что думать об этом в естественном языке на самом деле не работает в этом случае, поскольку я думаю: «Хорошо, что на самом деле не имеет смысла, чтобы продукт имел много элементов флаера» ... но тогда это отношения между таблицами , поэтому я должен помнить об этом так. – MxyL

+0

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

+0

Ваша интерпретация будет более точным представлением отношений между элементом флаера и продуктом. В этом контексте «имеет много» имеет смысл. – MxyL

Смежные вопросы