2016-12-23 4 views
0

У меня есть Profile, который может быть published. A profile принадлежит_:user и has_many :ratings.Как сортировать по ассоциации конкретного пользователя?

A User has_one :profile, и has_many :ratings.

A Rating belongs_to :profile && belongs_to :user.

Эти схемы для вышеуказанных моделей:

Profile.rb:

# == Schema Information 
# 
# Table name: profiles 
# 
# id      :integer   not null, primary key 
# first_name    :string 
# last_name    :string 
# created_at    :datetime   not null 
# updated_at    :datetime   not null 
# user_id     :integer 

User.rb:

# == Schema Information 
# 
# Table name: users 
# 
# id      :integer   not null, primary key 
# email     :string   default(""), not null 
# created_at    :datetime   not null 
# updated_at    :datetime   not null 
# first_name    :string 
# last_name    :string 

Rating.rb

# == Schema Information 
# 
# Table name: ratings 
# 
# id   :integer   not null, primary key 
# speed  :integer   default(0) 
# passing :integer   default(0) 
# tackling :integer   default(0) 
# dribbling :integer   default(0) 
# profile_id :integer 
# user_id :integer 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# 

Что я хочу сделать, это найти все профили, оцененные по 1 rating атрибуту .... например. все опубликованные профили оцениваются по passing (от наивысшего до самого низкого).

Я пытался что-то вроде этого:

Profile.published.where(id: coach.ratings.order(passing: :desc).pluck(:profile_id)) 

Но это не всегда дает мне профили в порядке, я ожидал.

Итак, как мне сделать этот запрос, который позволяет мне получить эти профили, оцененные по всем этим рейтингам соответственно?

Edit 1

Обратите внимание Главное здесь в том, что мне нужно найти рейтинги профиля, оставленного конкретным пользователем.

По моему запросу выше, coach = User.find(7).

Таким образом, каждый User оставляет кучу ratings на многих profiles.

Что я хочу сделать, это отфильтровать все profiles, которые имеют определенный рейтинг (скажем speed) и закажите эти профили, по рейтингу скорости от самого высокого до самого низкого (но это зависит от пользователя).

+0

Поправьте меня, если я ошибаюсь. Я вижу, что ваша логика кажется путаной. Рейтинг (profile_id, user_id). Это означает, что пользовательский профиль является n-n. Но вы установили профиль отношений - пользователь 1-1 раньше. –

+0

Пользовательский профиль 1-1, рейтинг для профиля n-n. Как вы получили профиль пользователя n-n? Единственное, что может быть правдой, - это установить «has_many rating_users через:: рейтинги», нет? – marcamillion

+0

'User-Rating 1-n',' Profile-Rating 1-n' => 'Пользовательский профиль n-n' –

ответ

2

Используйте присоединиться:

Profile.published 
    .joins(:ratings) 
    .where(ratings: { user_id: coach.id }) 
    .order('ratings.passing') 
+0

Как найти оценки для соответствующего пользователя? 'coach' - пользователь в моем исходном запросе. См. Обновленный вопрос, чтобы получить больше ясности относительно того, что я ищу. – marcamillion

+0

Bro .... wow ... безупречный. Это именно то, что я искал. Работает как шарм. Так просто и чисто. Не могу поверить, что я никогда не думал об этом 'где (рейтинги: ...)'. – marcamillion

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