【问题标题】:Accessing associated class with scope访问具有范围的关联类
【发布时间】:2018-08-09 13:29:57
【问题描述】:
class A
    scope :scope_name -> {scope_condition}
end

class B
  has_many :a
end

我需要在 A 的范围内通过 B 访问 A 吗?比如

当我调用B.last.a 时,它应该会获取我B.last.a.scope_name 的结果。

不使用default_scope或条件关联(has_many :a -> {scope_condition})可以做到吗?

【问题讨论】:

  • 顺便说一句,你自己给出了答案……为什么这对你不起作用?
  • 为什么不直接覆盖:a 方法呢?顺便说一句,它可能应该是has_many :as(复数,而不是单数)。
  • 您能否更具体地说明为什么默认范围或条件关联不合适?这将帮助我们了解哪些类似的解决方案也行不通。

标签: ruby-on-rails ruby activerecord associations rails-activerecord


【解决方案1】:

不,没有 default_scope、条件关系或 B 上的实例方法是无法做到的。

就像你说的,你什么时候打电话:

a_with_scope = B.find(1).a.scope_name

你会得到A的作用域版本,但是如果你想通过调用B.find(1).a找到完全相同的结果,你确实需要在模型A上设置默认作用域,或者在关系上创建条件,或者创建方法在 B 上:

class B
  def a_scoped
   a.with_scope
  end
end

【讨论】:

  • 所以,OP 说 “当我打电话给 B.last.a 时,它应该接我 B.last.a.scope_name。这样做吗?
  • 我认为 OP 不想调用 .scope_name,正如他所说“当我调用 B.last.a 时,它应该获取我 B.last.a.scope_name 的结果。”我想知道为什么他不想使用.scope_name
  • 同意...没有阅读过去的第一个问题。相应地更新了答案。
  • "不使用default_scope或者条件关联可以做到吗?"
【解决方案2】:

您可以使用scoping 暂时将作用域应用于 A:

A.scope_name.scoping do
  # some time later..
  B.last.a # this (and any other use of A) will be scoped with scope_name
  # ...
end

这将充当默认范围,具有许多相同的注意事项和陷阱,但它不是应用程序范围的。

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多