Rails - запрос ActiveRecord - найти первый элемент, где отношение. Не менее 1 - PullRequest
0 голосов
/ 13 марта 2012

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

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

Я пытаюсь найти самое последнее сообщение, содержащее хотя бы один комментарий.

Я пробовал это:

@post = Post.find_by_sql("SELECT *, count(comment.id) AS num_of_comments
  FROM post
  INNER JOIN comment ON post.id = comment.post_id
  WHERE num_of_comments >= 1").last

, но получил сообщение о том, что num_of_comments был неизвестным столбцом.

Затем я попробовал метод на Post, но он не сработал:

def self.has_been_commented
  where("comments.count <= 1")
end

Затем я начал изучать области видимости., и увидел метод .joins, но не был уверен, как я мог тогда указать другой фильтр.Что-то вроде:

scope :has_been_commented, joins(:comments)

но тогда я не уверен, как указать где (: comments.count> = 1)

Извините, если это сбивает с толку ...

Ответы [ 2 ]

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

Я нашел ответ на свой вопрос:

Post.find(:all, :joins => "INNER JOIN comment ON comment.post_id = post.id", .
  :select => "post.*, count(comment.id) comment_count", 
  :group => "comment.post_id HAVING comment_count >= 1").last
0 голосов
/ 14 марта 2012

Вы имеете множественное число comments и единственное число comment, свободно смешанные вместе. Если вы следуете «пути Rails», тогда все будет во множественном числе, даже имя базы данных, , кроме вашего имени класса. Цель состоит в том, чтобы убедиться, что генерируемый SQL соответствует вашей таблице базы данных.

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