范围如何运作?

时间:2016-01-12 22:15:53

标签: ruby-on-rails ruby-on-rails-4

我无法理解这里发生了什么以及以什么顺序发生了什么。有人可以就这个范围内的工作方式给我一些澄清吗?

class Article < ActiveRecord::Base
  belongs_to :category

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

1 个答案:

答案 0 :(得分:3)

这行代码:

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等于的类别你给了范围的slu ..如果找到任何类别,那么具有此类别的所有文章记录将被捕获&#34; (退回)你的范围。

示例:

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