2010-07-19 4 views
1

У меня есть модели, как это:ActiveRecord найти через has_one ассоциации атрибут детского

class Discussion < ActiveRecord::Base 
    has_many :comments 
    has_one :special_comment, :class_name => "Comment" 
end 

class Comment < ActiveRecord::Base 
    belongs_to :discussion 
    # contains author 
end 

Как я могу выбрать все Discussion через примыкала :special_comment «автора» ассоциации. Эффективно я хочу сделать что-то вроде:

select * from discussions 
inner join comments on comments.discussion_id=discussion.id 
where comments.author = 'poopface' 

я получаю что-то близкое с этим:

Discussion.find (: все,: условия => {: автор => 'poopface'} ,: joins =>: special_comment) ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: нет такого столбца: discussion.author: SELECT «обсуждения». * FROM »обсуждения« INNER JOIN »комментарии« ON comments.discussion_id = discussion.id ГДЕ («обсуждения». «Автор» = 'poopface')

Но это должно быть WHERE ("comments"."author" = 'poopface')

Спасибо!

+0

Что такое has_one для определения «special_comment», а не других комментариев? has_one используется вместо assign_to, где ваш внешний ключ находится на другом объекте. Это ваша ситуация? –

ответ

0

Если у вас есть некоторые ForeignKey на вашем столе Комментарии, что ваш has_one ссылается ...

Discussion.find(:all, :conditions => {:comments=>{:author => 'blah'}}, 
        :joins => :special_comment) 

даст вам все обсуждения, где special_comment является автором «бэ».

Discussion.find(:all, :conditions => {:comments=>{:author => 'blah'}}, 
        :joins => :comments) 

предоставит вам все обсуждения, на которых у них есть комментарии автора 'blah'.

+0

Это вызовет ошибку SQL. Хеш-ключ 'special_comment' используется как псевдоним таблицы для таблицы' discussion', путем вызова 'find'. Псевдоним таблицы для таблицы 'debate' - это' обсуждения'. Это известное ограничение при использовании вложенного хэша для условий. –

+0

справедливая точка .. Это должны быть «комментарии» тогда .. special_comment - это ссылка на комментарий, а не дискуссия. - Я верю. –

+0

Вы правы, 'special_comment' относится к' comments'. –

2

Попробуйте это:

Discussion.all(:conditions => {:comments=> {:author => "blah"}}, 
      :joins => :comments) 

ИЛИ

Discussion.all(:conditions => ["comments.author = ?", "blah"], 
      :joins => :comments) 

Примечание: Может быть, вы могли бы использовать лучшее имя автора в примере кода.

+0

Обновлен ответ после исправления ошибки. –

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