Поиск has_many: через ассоциацию, включая среднюю модель - PullRequest
0 голосов
/ 04 марта 2012

Во-первых, тема.

У меня есть три модели, которые связаны между собой с помощью ассоциации через has_many: как это:

#User model 

has_many :chars_del, :class_name => CharDelegated, :dependent => :destroy
has_many :chars, :through => :chars_del

#CharDelegated model
#has a field owner:integer

belongs_to :char
belongs_to :user

#Char model
#has fields name:string

has_many :chars_del, :class_name => CharDelegated
has_many :users, :through => :chars_del

Что мне нужно сделать, это янеобходимо выполнить поиск в пользовательской записи, чтобы найти все символы, принадлежащие конкретному пользователю (поле: owner), упорядоченные по имени.Я застрял с этим в течение пары часов, поэтому я считаю, что мог пропустить очень простой ответ ... Но ничего, что я пробовал до сих пор, не сработало даже немного.

ОБНОВЛЕНИЕ нашел что-то, что работает:

user.chars.where(:char_delegateds => {:owner => 1}).order('name')

не знаю, почему: chars_del выдал ошибку, но полное имя таблицы выполнило задание.

Эндрю, ваш ответ тоже работает хорошо и немного быстрее в базе данных, чем много.

Ответы [ 2 ]

0 голосов
/ 21 января 2013

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

@ char = Char.all (: include =>: users,: condition => ["char_delegated.user_id in (?)", User_id]). Order ('name')

0 голосов
/ 04 марта 2012

ли

user.chars.order('name')

не работает? (Учитывая, user является одним User экземпляром.)

Редактировать

Учитывая вашу новую информацию:

CharDelegated.where(user_id: user.id, owner: true).map(&:char)

должно работать.

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