我无法理解这里发生了什么以及以什么顺序发生了什么。有人可以就这个范围内的工作方式给我一些澄清吗?
class Article < ActiveRecord::Base
belongs_to :category
scope :by_category, -> (slug) { joins(:category).where('categories.slug = ?', slug) if slug }
end
答案 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