Rails: Как я могу добиться загрузки ассоциаций с сортировкой по экземпляру метода? - PullRequest
2 голосов
/ 16 апреля 2011
class Newsroom < ActiveRecord::Base
  has_many :blog_posts
  has_many :quote_posts
end

class BlogPost < ActiveRecord::Base
  belongs_to :newsroom
end 

class QuotePost < ActiveRecord::Base
  belongs_to :newsroom
end

Я хотел бы иметь метод экземпляра, такой, чтобы я мог сделать @ newsroom.posts, чтобы получить коллекцию blog_posts и quote_posts, отсортированных по create_at.

def posts
   @posts ||= #load and sort blog_posts, quote_posts, etc
end

Какой самый лучший и самый эффективный способ сделать это? Я рассмотрел использование default_scope, что-то вроде:

default_scope :include => [:blog_posts, :quote_posts]

def posts
  @posts ||= [blog_posts + quote_posts].flatten.sort{|x,y| x.created_at <=> y.created_at}
end

Но я бы предпочел сохранить сортировку на уровне базы данных, если это возможно. Любые предложения о том, как это сделать? Благодаря.

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Попробуйте что-то вроде этого:

#app/models/newsroom.rb

scope :ordered_posts, lambda {
  includes(:blog_posts,:quote_posts) & BlogPost.order("created_at asc") & QuotePost.order("created_at asc")
}

ARel должен иметь возможность обрабатывать заказы включенных цитат и сообщений блога. Вы можете немного исправить это, имея области в моделях BlogPost и QuotePost, которые упорядочены с помощью create_at, а затем использовать эти области в методе Newsroom # order_posts.

0 голосов
/ 17 апреля 2011

Я использовал полиморфную модель поста.Это, кажется, дает мне то, что я хочу, с незначительным недостатком наличия дополнительной модели / стола.Я использовал делегат для передачи определенных методов получения атрибутов правильной модели.

class Newsroom < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belong_to :blog_post, :polymorphic => true

  delegate :title, :author, :etc, :to => :postable
end

class BlogPost < ActiveRecord::Base
  has_one :post, :as => :postable
end
...