【问题标题】:How you use a default scope with STI?您如何在 STI 中使用默认范围?
【发布时间】:2013-02-06 07:59:31
【问题描述】:

我在处理 STI 情况下的 default_scope 时遇到了麻烦。有什么方法可以防止子类中存在 default_scope 或覆盖查询条件?

class Parent < ActiveRecord::Base
  default_scope where(:type => ["Child", "OtherChild"])
  scope :flag, where(:flag => true)
end

class Child < Parent
end

class OtherChild < Parent
end

Parent.all => 产生正确的结果,返回所有 Child 和 OtherChild 项。它不返回“RemovedChild”类型的对象,该类型在系统中不再有模型。

Child.all => 产生正确的结果,所有 Child 结果。

Child.flag.all => Broken,而不是所有带有 flag = true 的 Child,它返回与 Parent.flag.all 相同的结果,添加来自 Parent 类的 default_scope 替换了 Child 类添加的 type = Child .

我必须假设 Parent 表将包含类型与当前可用类不对应的项目,这是我的默认范围试图解决的问题。如果有一种方法可以全局捕获并忽略 ActiveRecord::SubclassNotFound 的任何实例,那也可以。

【问题讨论】:

  • try: scope :flag -> {where(flag:true)},我相信通过不使用 lambda,您不会在正确的时间解析范围(即当您调用它时)什么时候定义它)
  • 不走运,我切换到范围 :flag, lambda { where(:flag => true) } 并得到了相同的结果。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

要延迟范围解析和解决方法,您可以切换到定义类方法而不是范围。

class Parent < ActiveRecord::Base
  default_scope where(:type => ["Child", "OtherChild"])
  def self.flag
    where(:flag => true)
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多