Исполнители 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