0

我正在使用一个 has many through 关联,如下所示:

class Rating < ActiveRecord::Base  
  has_many :recommendation_ratings, :dependent => :destroy
  has_many :recommendations, :through => :recommendation_ratings
end

class Recommendation < ActiveRecord::Base  
  has_many :recommendation_ratings, :dependent => :destroy
  has_many :ratings, :through => :recommendation_ratings
end

class RecommendationRating < ActiveRecord::Base  
  validates :recommendation_id, presence: true
  validates :rating_id, presence: true

  belongs_to :recommendation
  belongs_to :rating
end

我目前正在我的控制器中创建我的关联,如下所示:

   rr   = RecommendationRating.find_by_recommendation_id(recommendation_id)
   rr ||= RecommendationRating.new(recommendation_id: recommendation_id)

   rr.rating_id = rating_id
   rr.save

或者,我可以为推荐分配评级,如下所示:

   @recommendation = Recommendation.find(recommendation_id)
   @rating = Rating.find(rating_id)
   @recommendation.ratings << @rating

哪种方法是关联这些记录的正确方法,第一种方法有缺点吗?

4

2 回答 2

0

这取决于你需要什么。

第一个更新一条recommendation_rating记录(如果它已经存在)并使您能够在调用后运行回调和验证save

第二个会在您每次调用<<时创建评分,并直接在数据库上创建记录,因此不会触发验证和回调。

于 2013-02-01T02:14:50.683 回答
0

我想我可能会

RecommendationRating.find_or_create_by_rating_id_and_recommendation_id(
  rating_id,
  recommendation_id
)

我相信,如果我理解正确的话,它在功能上等同于您描述的两种方法。

于 2013-02-01T02:22:04.660 回答