如何为belongs_to禁用default_scope?

时间:2009-10-08 21:37:16

标签: ruby-on-rails

有没有办法为单个default_scope关联停用belongs_todefault_scope对于我想绕过范围的单belongs_to以外的所有人都可以。我熟悉with_exclusive_scope但我不认为可以与belongs_to一起使用。

有什么建议吗?

上下文:我正在尝试允许acts_as_revisable中的branch_source关联指向不是最新的修订版(revisable_is_current为false)。

4 个答案:

答案 0 :(得分:33)

派对可能有点晚了(短短3年),但只是遇到了同样的问题,Tobias的解决方案肯定是正确的方向,但它可以简化为Rails 3.2+。我唯一不喜欢的是Document的“硬编码”类名,也许可以使用反射来改变......

无论如何这就是我想出来的:

class Comment < ActiveRecord::Base
  # Document has some kind of default_scope
  belongs_to :document

  # Ensure document is not scoped, because Rails 3.2 uses modules it's
  # possible to use simple inheritance.
  def document
    Document.unscoped { super }
  end
end

更新:根据reflect_on_association https://gist.github.com/2923336

获得了一个通用解决方案

答案 1 :(得分:31)

belongs_to :account, -> { unscope(where: :destroyed_at) }

对我有用,Rails 4.1

答案 2 :(得分:14)

我自己就是这个问题,这就是我想出的:

class Comment < ActiveRecord::Base
  belongs_to :document # Document has some kind of default scope
                       # that stops us from finding it

  # Override getter method for document association
  def document_with_unscoped
    # Fetch document with default scope disabled
    Document.unscoped { document_without_unscoped }
  end
  alias_method_chain :document, :unscoped
end

答案 3 :(得分:0)

我删除了此

belongs_to :document

并替换为

def document
    Document.unscope(where: :deleted_at).find_by(id: document_id)
end

def document=(d)
    self.document_id = d&.id
end