Как отключить default_scope для own_to? - PullRequest
39 голосов
/ 09 октября 2009

Есть ли способ отключить default_scope для одной belongs_to ассоциации? default_scope подходит для всех, кроме одного belongs_to, который я бы хотел обойти. Я знаком с with_exclusive_scope, но я не думаю, что это можно использовать с принадлежащим.

Есть предложения?

Контекст: я пытаюсь разрешить ассоциации branch_source в acts_as_revisable указать на версию, которая не является последней (revisable_is_current неверно).

Ответы [ 4 ]

33 голосов
/ 13 июня 2012

Возможно, немного опоздал на вечеринку (всего 3 года), но столкнулся с той же проблемой, и решение от Тобиаса, безусловно, верное направление, но оно может быть упрощено для 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

Обновление : получено общее решение, основанное на refle_on_association https://gist.github.com/2923336

31 голосов
/ 15 апреля 2014
belongs_to :account, -> { unscope(where: :destroyed_at) }

у меня работает, Rails 4.1

14 голосов
/ 04 февраля 2011

Только что сам столкнулся с этой проблемой, и вот что я придумал:

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
0 голосов
/ 04 января 2019

Я удалил это

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...