Rails - нужна помощь в создании слабосвязанных ассоциаций - PullRequest
0 голосов
/ 09 июля 2011

У меня есть следующие модели с соответствующими ассоциациями:

class User < ActiveRecord::Base
  has_many :reviews
  has_many :ratings
end

class Product < ActiveRecord::Base
  has_many :reviews
  has_many :ratings
end

class Review < ActiveRecord::Base
  belongs_to :product
  belongs_to :user
end

class Rating < ActiveRecord::Base
  belongs_to :product
  belongs_to :user
end

Учитывая конкретный Rating, мне нужно перейти к соответствующему Review (если обзор существует).

Мне нужно, чтобы ratings и reviews были слабо связаны. (Я не хочу настраивать свою модель так, чтобы Review belongs_to a Rating)

Как мне установить rating's связь с reviews?

Как только я работаю с определенным рейтингом в представлении, я могу позвонить @rating.product.reviews.where(:user_id => @rating.user.id).first, но я бы хотел, чтобы он был чище / более эффективным, если это возможно.

Есть идеи?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 июля 2011

Попробуйте использовать: условия вроде так:

class Rating < ActiveRecord::Base
  has_many :reviews,
           :through => :user,
           :source => :reviews,
           :conditions => ['#{Review.table_name}.product_id = #{product_id}']
end

Если это не сработает, сделайте это вместо этого (очень похоже на ответ @RobinBrouwer):

class Rating < ActiveRecord::Base
  def reviews
    user.reviews.where(:product => product)
  end
end
0 голосов
/ 09 июля 2011

Вы можете создать отношение has_many :through, чтобы получить все отзывы.

class Rating < ActiveRecord::Base
  belongs_to :product
  belongs_to :user
  has_many :product_reviews, :through => :product, :source => :reviews
end

Теперь вы можете делать следующее, как и выше:

@rating.product_reviews.where(:user_id => @rating.user.id).first

Не очень хорошее улучшение.Вы можете поместить его в метод экземпляра для очистки вещей:

def review
  product_reviews.where(:user_id => user_id).first
end

Теперь вы можете просто сделать следующее, чтобы получить тот же результат:

@rating.review

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...