Как добавить дополнительное условие в JOIN, созданное с помощью include? - PullRequest
2 голосов
/ 20 марта 2010

Я хочу добавить дополнительные критерии к LEFT OUTER JOIN, сгенерированному параметром :include в ActiveRecord finder.

class Post
  has_many :comments
end

class Comment
  belongs_to :post
  has_many   :comment_votes
end

class CommentVote
  belongs_to :comment
end

Теперь допустим, я хочу найти последние 10 сообщений с их комментариями и голосами "за".

Post.find.all(:limit => 10, :order => "created_at DESC",
    :include => [{:comments => :comment_votes])

Я не могу добавить условие, чтобы проверить наличие голосов, так как он будет игнорировать сообщения без голосов. Таким образом, условие должно идти в предложение ON для JOIN, сгенерированного для comment_votes. Я желаю такой синтаксис, как:

Post.find.all(:limit => 10, :order => "created_at DESC",
    :include => [{:comments => [:comment_votes, :on => "comment_votes.vote > 0"])

Сталкивались ли вы с такими проблемами раньше? Вам удалось решить проблему с помощью текущего поиска? Я надеюсь услышать некоторые интересные идеи от сообщества.

PS: Я могу написать SQL для соединения, чтобы получить ожидаемый результат и соединить результаты вместе. Я хочу убедиться, что нет другой альтернативы, прежде чем идти по этому пути.

1 Ответ

3 голосов
/ 20 марта 2010

Если я правильно понимаю ваш вопрос, может сработать что-то подобное:

class Comment
  belongs_to :post
  has_many   :comment_votes
  has_many   :up_votes, :class_name => "CommentVote", :conditions => "vote > 0"
end

Тогда ваш искатель будет:

Post.find.all(:limit => 10, :order => "created_at DESC",
:include => {:comments => :up_votes})

Примечание: я не проверял это.

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