ActiveRecord найти через дочерний атрибут ассоциации has_one - PullRequest
1 голос
/ 20 июля 2010

У меня есть такие модели:

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 (: все,: условия => {: author => 'poopface'},: joins =>: special_comment) ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: такого столбца нет: arguments.author: ВЫБРАТЬ «обсуждения». * ИЗ «обсуждений» ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ = 'poopface')

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

Спасибо!

Ответы [ 2 ]

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

Попробуйте:

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

ИЛИ

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

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

0 голосов
/ 20 июля 2010

Если в вашей таблице комментариев есть какой-то посторонний ключ, на который ссылается ваш has_one ...

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

даст вам все обсуждения, где special_comment создан 'blah'.

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

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

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