Условия ассоциации ActiveRecord (Rails)

Представь, что у меня есть модель, пост которой has_many :comments. Как я могу отображать только сообщения с комментариями?

Мне довольно удобно работать с named_scope, но я не знаю, как поместить Post.comments (или self.comments) в хэш :conditions, который ожидает символы.

class Post < ActiveRecord::Base
     has_many :comments
     named_scope :with_comments, :conditions => [#self.comments.length > 0]
end

Что писать в комментариях?

Спасибо!


person user94154    schedule 16.06.2009    source источник


Ответы (2)


Лучше было бы поставить counter_cache на Post.

class Comment < AR:Base
  belongs_to :post, :counter_cache => true
end

Тогда вам нужно всего лишь сделать 1 запрос вместо двух.

Post.find(:all, :conditions => ["counter_cache > 0"])

person BJ Clark    schedule 17.06.2009

Вы должны иметь возможность просто присоединиться к таблице комментариев, выбрав отдельные строки.

named_scope :with_comments, :joins => :comments, :select => 'DISTINCT posts.*'
person slillibri    schedule 16.06.2009
comment
выглядит потрясающе. Как я могу передать аргументы, позволяющие мне вручную вводить имена атрибутов. в моей таблице сообщений есть pk с именем postid, а в таблице комментариев есть fk с именем post_id. Я знаю, как вручную установить pks и fks в ассоциациях, как мне это сделать с named_scope? еще раз спасибо, это действительно качественный ответ. - person user94154; 17.06.2009
comment
Просто замените параметр :joins на желаемое соединение. Вероятно, вы хотите что-то вроде следующего: :joins =› 'INNER JOIN comments ON comments.post_id = posts.postid' - person slillibri; 18.06.2009
comment
В Rails :joins по умолчанию используется INNER JOIN - person Bart Jedrocha; 18.10.2011