Rails 3 Query Interface: использование связанных моделей - PullRequest
2 голосов
/ 20 октября 2010

Я буду использовать общий пример блога.

class Post < ActiveRecord::Base
  has_many :comments
end
class Comment < ActiveRecord::Base
  belongs_to :post
end

Когда вы запрашиваете Post, как вы получаете доступ к его ассоциациям (например, к комментариям)?мир, но я не нашел никакой документации по нему.Даже http://edgeguides.rubyonrails.org/3_0_release_notes.html#query-interface и http://m.onkey.org/2010/1/22/active-record-query-interface были бесполезны, в основном говоря: «Теперь есть методы, такие как объединения и включения, которые делают то же самое, что и операторы SQL».да, спасибо.

Итак, вот очень простые вещи, которые я хочу сделать, которые не работают, но должны быть очевидны то, что я пытаюсь сделать:

Post.where(:comments.count >= 10)
Post.where(:comments.author_id == current_user.id)
Post.order(:comments.count)

Как мы можем сделатьэто, не прибегая к рубиновому коду, который пахнет SQL (таким образом, побеждая цель Active Record)?Спасибо:)

Ответы [ 2 ]

0 голосов
/ 20 октября 2010

Post.where (: comments.count> = 10)

Post.find(:all).select{|p| p.comments.count >= 10)

Post.where (: comments.author_id == current_user.id)

Post.find(:all).select{|p| p.comments.select{|c| c.author_id == current_user.id } }

Post.order (: comments.count)

Yikes, this one beats me.

Привет, мои два поста довольно тяжелы для SQL.Я знаю, что люди делают это более элегантно с

Post.find(:all, :conditions => blah blah blah..

Но я не уверен, как это выразить.К сожалению.

0 голосов
/ 20 октября 2010

Если вы установите counter_cache для публикации для комментариев, вы сможете увидеть, сколько комментариев у них есть без запроса, это делает это проще и быстрее.

Это займетзабота о первом и последнем вопросе, который вы задали.

Затем вы можете запросить их следующим образом:

  Post.where(:comments_count >= 10)
  Post.order(:comments_count)

Но вам лучше настроить границы для этого.Я не уверен, что вы хотите сделать со вторым вопросом, хотите ли вы показать все посты, где прокомментировал текущий пользователь?

...