2013-05-25 2 views
1

Я читал руководства по связям Rails, но я все еще не уверен, правильно ли я делаю это.Rails - полиморфные ассоциации с моделями объединения

У моего приложения есть пользователи и продукты.

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

я понял, что я сделал бы присоединиться к модели под названием Статьи:

belongs_to :user 
    belongs_to :building 
    belongs_to :contributable, polymorphic: true 

А потом для пользователя:

has_many :contributions, as: contributable 
has_many :products, through: contributions 

Продукты:

has_many :contributions, as: contributable 
has_many :users, through: contributions 

И затем, например, в моя Модель отзыва:

belongs_to :user 
belongs_to :product 

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

Соединительная таблица с полиморфными ассоциациями - правильный путь сюда?

ответ

4

Я думаю, что-то вроде этого - то, что вы ищете.

class User < ActiveRecord::Base 
    has_many :contributions 
end 

class Product < ActiveRecord::Base 
    has_many :contributions 
end 

class Contribution < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :product 
    belongs_to :contributable, :polymorphic => true 
end 

class Comment < ActiveRecord::Base 
    has_one :contribution, :as => :contributable 
end 

class Review < ActiveRecord::Base 
    has_one :contribution, :as => :contributable 
end 

class Photo < ActiveRecord::Base 
    has_one :contribution, :as => :contributable 
end 

Убедитесь, что есть contributable_id и contributable_type полей в contributions таблице.

+0

Получил благодарность! Нужен ли мне этот тип таблицы соединений и полиморфная ассоциация? Могу ли я также сделать что-то вроде Product has_many: обзоры, has_many: комментарии и т. Д., А для отзывов - to own_to: user и принадлежит_to: product? – Zephyr4434

+0

Это может зависеть от того, сколько из этих типов будет использовано ваше приложение. Например, по мере того, как вы добавляете все больше и больше, 'Product' может закончиться большим использованием макросов' has_many', чем вам хотелось бы. Еще одна вещь, которую следует учитывать, - это часто запрашивать список всех трех типов. Например, если вы хотите график. В настоящее время вы можете делать '@ product.contributions' и просто сортировать их, как хотите. В противном случае вам придется делать '@ product.reviews',' @ product.comments' и '@ product.photos' и вручную объединять и сортировать их самостоятельно. Тем не менее, на самом деле он может быть хорошим в зависимости от вашего приложения. – veidt

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