如何通过实例和方法进行排序来快速加载关联?


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。获取按created_at排序的blog_posts和quote_posts的集合。

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

但是,如果可能的话,我宁愿将排序保持在数据库级别。对如何做到这一点有什么建议吗?谢谢。

试试这样:

#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模型中使用created_at排序的作用域,然后在Newsroom#ordered_posts方法中使用这些作用域来稍微解决这个问题。

我最终使用了一个多态帖子模型。这似乎给了我我想要的,有一个额外的模型/表的微不足道的缺点。我使用委托将特定的属性getter方法传递给正确的模型。

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

相关内容

  • 没有找到相关文章

最新更新