【发布时间】:2018-07-25 10:53:16
【问题描述】:
关于 ActiveRecord 范围,我现在处于两难境地。 AFAIU,模型内部的作用域被转换为类方法,因此它们只能由类而不是对象调用。 例如,如果我有一个 User 属于 Company 关联并且 Company 具有这样的范围:
scope :blacklisted_companies, -> { ...some code here...}
我只能像Company.blacklisted_companies一样打电话给blacklisted_companies,对吧?
但是,我可以通过 Rails 控制台中的关联对象访问它,如下所示:
user.company.blacklisted_companies.
谁能解释这怎么可能?
编辑:根据建议进行澄清,我打算问为什么它 (user.company.blacklisted_companies) 在控制台中而不是在实际代码中工作
【问题讨论】:
-
它在关联对象上调用时与方法委托有关,因此基本上所有未在 user->company 关联上定义的内容都将委托给公司类本身。
-
@potashin 你的标志不正确。这个问题是关于范围如何与 ActiveRecord 关系和类方法相关的,与预加载无关。相关问题可能有助于回答这个问题,但从根本上来说是一个不同的问题。
-
我相信你不能仅仅通过在
Company模型中定义一个范围来在user.company上调用blacklisted_companies,因为user.company不返回 ActiveRecord 关系,而是返回单个对象。 -
正确,但是在尝试访问 user.company.blacklisted_companies 时会引发未定义的方法
错误。它在 Rails 控制台上运行良好。这就是令人困惑的地方。 -
user = User.find(1) -> user.company.blacklisted_companies
标签: ruby-on-rails rails-activerecord