【问题标题】:Adding a Rating to each User per category on Ruby on Rails在 Ruby on Rails 上为每个类别的每个用户添加评分
【发布时间】:2010-07-15 23:27:18
【问题描述】:

现在我正在构建一个社交媒体应用程序,我希望用户在其中对每个类别进行评分,该关联将如何进行?需要设置的方式 每个用户在每个类别中都有不同的评分。

我觉得

belongs_to :user
belongs_to :category

在 UserCategoryRating 模型中。

has_many :user_category_ratings, through => :category

在用户模型上,这是正确的方法吗?

UserCategoryRating 表有 User_id 列、Category_id 列和 rating 列,每次用户获得投票时都会更新(评级只是投票之间的 AVG 和基于 1-5 的分数)

【问题讨论】:

  • 这个问题的标题并没有说明问题/问题是什么——你可能想让它更具描述性。
  • 谢谢约翰,我刚刚更新了我的标题。

标签: ruby-on-rails activerecord associations has-many-through


【解决方案1】:

更新:如果我对您的理解正确,这里是您想要的简单设计图:

这将是你的类的基本框架:

class User < ActiveRecord::Base
   has_many :ratings
   # has_many :categories, :through => :ratings
end

class Category < ActiveRecord::Base
   has_many :ratings
   # has_many :users, :through => :ratings
end

class Rating < ActiveRecord::Base
    belongs_to :user
    belongs_to :category
    validates_uniqueness_of :user_id, :scope => [:category_id]
end

将允许这些查询:

@category_ratings_by_user = Rating.where("ratings.user_id = ? AND ratings.category_id = ?", user_id, category_id)
@specific_rating = user.ratings.where("ratings.category_id = ?", category_id)
# make nice model methods, you know the deal

# ... if you added the has_many :through,
@john = User.find_by_name("john")
# Two ways to collect all categories that john's ratings belong to:
@johns_categories_1 = @john.ratings.collect { |rating| rating.category }
@johns_categories_2 = @john.categories

@categories_john_likes = @john.categories.where("categories.rating >= ?", 7)

我只是不确定你为什么想要这个has_many, :through(这看起来不像是多对多——评级只属于一个用户,对吗? ).

【讨论】:

  • 是的,一个评分只属于一个用户,但一个用户可以有多个评分(每个类别一个),那么不会是多对多的关系吗?
  • 即使其他解决方案有效,您的看起来更干净,我很想收到您的回复:D
  • @Gotjosh,我不确定我是否完全理解了你的问题......除了他们的〜'score'值之外,一个用户对一个类别的多个评级是否可以区分?我假设它们属于不同的类型,这就是为什么我添加了:type_of_rating 字段并添加了一个作用域唯一性验证器。否则,如果评级不能真正相互区分,您可以删除该行并制作一个允许 user_ratings 不需要唯一的验证器。你明白我想说什么吗?
  • 您想要has_many :through 的原因是,如果您希望UserCategory 彼此拥有某种所有权——在这种情况下,它们没有。虽然它们都与Rating s 具有 1-* 关系,但这种关系完全由Rating s 的数据库中这些模型的两个外键和一些不错的 Rails 方法维护。现在,您可能想要使用:through Rating 模型,但您的要求似乎也没有必要(如果您想使用User.find(1).categories -- 获得用户投票的所有类别)。跨度>
  • 我会更新我的答案,如果您还有问题,请告诉我。 PS:你试过这个吗?你得到了你所期望的吗?
【解决方案2】:

我将使用以下数据模型:

class User
  has_many :user_categories
  has_many :categories, :through => :user_categories
end

class UserCategory
  belongs_to :user
  belongs_to :category
  # this model stores the average score also.
end

class Category
  has_many :user_categories
  has_many :users, :through => :user_categories
end

现在,当您想更新某个类别的用户得分时

uc = u.user_categories.find_by_category_id(id)
uc.score = score
uc.save

【讨论】:

  • 我不认为这就是我要找的,用户不需要有类别,文章需要有类别,我已经开始工作了。我需要的是每个类别中每个用户的分数/评分。
  • 我已经更新了我的答案。我很确定您将能够使用建议的模型存储用户和类别组合的分数。
  • 我正在尝试这个解决方案,但它似乎无法在我的 rails 控制台上运行,我创建了一个 UserCategory 对象,然后从数据库中检索了一个类别,然后是一个用户,然后尝试将它们附加到 UC 对象上,但它不起作用。
  • 这个回复也不错!但另一个很好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2016-12-07
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
相关资源
最近更新 更多