Прежде всего вы должны отформатировать свой вопрос в соответствии с SO
рекомендациями, возможно, потому что вы получаете отрицательные голоса ...
В любом случае, я думаю, вы ищете полиморфные ассоциации .
Предполагается, что Product
означает продукт, доступный в вашем магазине, а LineItem
представляет продукт в заказе:
class LineItem < ActiveRecord::Base
has_one :product # ONE LineItem references ONE product in the shop
belongs_to :cart # respectively belongs_to :order
end
class Cart < ActiveRecord::Base
has_many :line_items # ONE Cart HAS MANY LineItems
end
class Product < ActiveRecord::Base
belongs_to :buyable, :polymorphic => true
# here you would have general attributes representing a product, e.g. 'name'
end
class Car < ActiveRecord::Base
has_one :product, :as => :buyable
# here you would have specific attributes in addition to the general attributes in
# product, e.g. 'brand'
end
class Apartment < ActiveRecord::Base
has_one :product, :as => :buyable
# here you would have specific attributes in addition to the general attributes in
# product, e.g. 'address'
end
Чтобы это работало, ваша таблица products
должна иметь два столбца
- buyable_type (строка)
- buyable_id (целое число)
Таким образом, в своем коде вы можете проверить, что именно ваш продукт, выполнив
@product = Product.find(params[:id])
if @product.buyable.is_a? Car
puts @product.buyable.brand
elsif @product.buyable.is_a? Apartment
puts @product.buyable.address
end