Как изменить эти операторы SQL с несколькими объединениями в запросы стиля ActiveRecord? - PullRequest
1 голос
/ 01 июля 2011

Исполнители have_many: посты, сообщения have_many: комментарии. Художники следуют за другими художниками, которые им нравятся, через «вдохновение». (Я хочу создать новостную ленту в стиле Facebook, чтобы показать последние действия, такие как:)

  • кто-то опубликовал новый комментарий к одному из моих постов
  • художник, за которым я следую, добавил новый пост
  • артист, за которым я следую, получил новый комментарий к конкретному сообщению

Моя идея состоит в том, чтобы выполнить 3 независимых запроса, описанных выше, и объединить окончательные сообщения по дате desc. Вот как я получаю 3 запроса, используя методы из моего класса Artist:

 def comments_on_my_posts
   Comment.where(:joins => :post, :conditions => {:posts => {:artist_id => 1}}).order("comments.updated_at DESC")
 end

 def posts_from_my_follows
   #SELECT * FROM posts inner join inspirations on posts.artist_id = inspirations.author_id where inspirations.artist_id = self.id
   #
 end

 def comments_on_posts_on_people_i_follows
   # SELECT * FROM comments inner join posts on comments.post_id = posts.id inner join inspirations on posts.artist_id = inspirations.author_id where inspirations.artist_id = self.id
 end

Я предпочитаю не использовать SQL напрямую, если мне не нужно. Но я не знаю, как сделать несколько соединений с помощью ActiveRecord.

Для справки, вот мои модели:

class Artist < ActiveRecord::Base

  has_many :posts, :dependent => :destroy, :order => 'updated_at DESC'
  has_many :inspirations
  has_many :follows, :through => :inspirations, :source => :inspiration

end


class Post < ActiveRecord::Base

  belongs_to :artist
  has_many :comments, :dependent => :destroy, :order => 'updated_at DESC' 

end

class Comment < ActiveRecord::Base

  belongs_to :author, :class_name => "Artist", :foreign_key => :author_id
  belongs_to :post

end

class Inspiration < ActiveRecord::Base

  #the follower
  belongs_to :artist

  #the followee
  belongs_to :inspiration, :class_name => 'Artist', :foreign_key => :author_id

  validate :disallow_self_referential_following

  validates_uniqueness_of :artist_id, :scope => :author_id

  def disallow_self_referential_following
    if artist_id == author_id
    errors.add(:author_id, 'cannot follow self')
  end
end

1 Ответ

0 голосов
/ 03 июля 2011

Интерфейс запроса Rails 3 для объединений описан здесь: http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-the-joined-tables.

С Rails 3 вы можете объединить ваши вызовы ActiveRecord вместе, чтобы создать нужный запрос. Обязательно посмотрите файл журнала разработки, чтобы увидеть генерируемые запросы. (Если вы не используете версию Rails 3.1). Вы также можете добавить вызов .to_sql в конец запроса, чтобы увидеть, что он генерирует.

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