【问题标题】:How is ActiveRecord scope accessible through object from Rails console?如何通过 Rails 控制台中的对象访问 ActiveRecord 范围?
【发布时间】: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


【解决方案1】:

通过 Rails 中的关联实现 ActiveRecord 关系,它是作用域的有效目标。

例如:Rails PoV 中的user.company 等价于Company.where(user: user),尤其是因为它都是惰性求值的。

这相当于一个类方法,因此你可以在它上面调用作用域。

编辑:OP 改变了问题,忽略这个答案。

【讨论】:

  • user.company 等价于Company.where(user: user).first
  • 正确,但是在尝试访问 user.company.blacklisted_companies 时会引发未定义的方法 错误。它在 Rails 控制台上运行良好。这就是令人困惑的地方。
  • @JagdeepSingh 我同意,但只有一次评估。由于懒惰,它是一种关系,它会在中间插入范围。如Company.where(user: user).blacklisted_companies.first
  • @steady_daddy 如果是这种情况,你问错了问题,你能打开一个包含真正问题的新问题吗?您的实际问题可能是由于文件加载顺序或方法重载或与您刚刚询问的内容无关的其他怪异。我不明白您为什么在问题中提到控制台。
  • 来自问题:“但是,我可以通过 Rails 控制台中的关联对象访问它,如下所示:user.company.blacklisted_companies”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 2016-01-18
  • 1970-01-01
  • 2015-10-12
  • 2016-07-01
  • 2017-09-30
  • 2015-12-21
相关资源
最近更新 更多