代码之家  ›  专栏  ›  技术社区  ›  Billy Logan

范围如何工作?

  •  1
  • Billy Logan  · 技术社区  · 10 年前

    我不明白这里发生了什么,顺序是什么。有人能给我一点关于这个范围内的工作原理的解释吗?

    class Article < ActiveRecord::Base
      belongs_to :category
    
      scope :by_category, -> (slug) { joins(:category).where('categories.slug = ?', slug) if slug }
    end
    
    1 回复  |  直到 10 年前
        1
  •  3
  •   MrYoshiji    10 年前

    这行代码:

    scope :by_category, -> (slug) { joins(:category).where('categories.slug = ?', slug) if slug }
    

    可以这样写:

    scope :by_category, lambda do |slug|
      if slug
        joins(:category).where('categories.slug = ?', slug)
      end
    end
    

    可以对ActiveRecord::Relation对象或模型本身(ActiveRecord::Base对象)调用作用域。

    例子:

    # in model
    class User < ActiveRecord::Base
      scope :admin, lambda { where(is_admin: true) }
    
    # in controller
    @admins = User.admin # returns a list of User record where `is_admin` is true
    

    现在,您的范围正在运行 joins(:category).where('categories.slug = ?', slug) ,这是怎么回事?

    关系 category 在模型上定义(很可能是 belongs_to :category )将在SQL查询中预加载,然后尝试查找具有该属性的类别 slug 等于你给示波器的子弹。如果找到任何类别,则您的范围将“捕获”(返回)具有该类别的所有文章记录。

    例子:

    Article.by_category('rails')
    # => returns all articles which belongs to a category called 'rails'
    # if no category with a slug equal to 'rails' exists in your DB,
    # no article will be returned