Добавление рейтинга каждому пользователю по категориям на Ruby on Rails - PullRequest
1 голос
/ 16 июля 2010

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

Я думаю, что

belongs_to :user
belongs_to :category

в модели UserCategoryRating.

и

has_many :user_category_ratings, through => :category

на модели User, это правильный подход?

Таблица UserCategoryRating содержит столбец User_id, столбец Category_id и столбец рейтинга, который обновляется каждый раз, когда пользователь получает голоса (рейтинг - это всего лишь AVG между голосами и счетом, основанным на 1-5)

Ответы [ 2 ]

2 голосов
/ 16 июля 2010

ОБНОВЛЕНИЕ : Если я вас правильно понимаю, вот схема простого дизайна, который вам нужен:

UML Diagram

И это будет основной скелет ваших классов:

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 (это не кажется многим - рейтинг принадлежит только одному пользователю, верно?) .

1 голос
/ 16 июля 2010

Я буду использовать следующую модель данных:

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
...