在Rails中使用HABTM关系设置范围

时间:2015-02-04 01:36:19

标签: ruby-on-rails activerecord

我在分类和帖子之间有has_and_belongs_to_many的关系。我正在设置一个范围来查询特定类别中的所有帖子。下面的范围有效,但看起来相当冗长。有没有更好的方法可以重构?

在Post模型中:

scope :in_category, ->(category) { joins(:categories).where(categories_posts: {category_id: category.id} ) }

3 个答案:

答案 0 :(得分:0)

我在Post模型中不知道其他任何方式。

但是创建这个范围是不必要的。假设您已经有Category个实例,则可以:

category.posts

修改

如果您正在寻找一个方法来调用Post类,请使用此范围(但我认为这会重新发明轮子,因为Rails已经提供了上述方法):

class Post
  scope :in_category ->(category) { category.posts }
end

答案 1 :(得分:0)

您可以使用类方法代替使用范围:

class Post < ActiveRecord::Base
  def self.in_category(category)
    category.posts
  end
end

Post.in_category(Category.first)

答案 2 :(得分:0)

def self.in_category(category_id)
    category_id.blank? ? all : joins(:category_id).where(:categories_posts => {category_id: category_id})
end

这种方法有一些好处

  • 您可以调用Post.in_category(id)并获取相应的帖子 你问的类别。
  • Post.in_category(nil)将返回所有帖子,如果您想将此范围与其他范围连接,这将非常有用。
  • Post.in_category([id1,id2])将返回两个类别中的帖子,id 1和id2(在这种情况下,将范围重命名为in_categories可能会很好)