Как использовать неограниченный по объему на связанных отношениях в Rails3?

У меня есть объем по умолчанию на продуктах из-за ограничений информационной безопасности.

class Product < ActiveRecord::Base
  has_many :photos

  default_scope where('visible = 1')
end

В моей связанной фото модели, однако, я также должен найти продукты, которые не должны быть видимы.

class Photo < ActiveRecord::Base
  belongs_to :product
end

my_photo.product

В других случаях я могу использовать неограниченный по объему для обхода default_scope, например, в Product.unscoped.find_by_title('abc'). Однако:

Как удалить объем при использовании ассоциаций записи?

my_photo.unscoped.product не имеет смысла, поскольку my_photo не назвали метод unscoped. Ни один не делает my_photo.product.unscoped имейте смысл как my_photo.product может уже быть ноль.

62
задан 21 January 2011 в 15:31

5 ответов

Я, вероятно, немного опаздываю стороне, но некоторое время назад я оказался в той же ситуации, и я записал драгоценный камень, чтобы сделать это легко: unscoped_associations.

Использование:

belongs_to :user, unscoped: true

Поддержка:

  • belongs_to
  • has_one
  • has_many

Полиморфные ассоциации также поддерживаются.

24
ответ дан 31 October 2019 в 13:34

Если Вам нужно, чтобы определенная ассоциация всегда была не ограничена по объему, можно не определить объем ее при определении ассоциации:

belongs_to :product, -> { unscope(where: :visible) }

По некоторым причинам, определенное where ключ не загружался правильно для меня, таким образом, я просто неограниченный по объему все where, который является другой опцией, которая, оказывается, удается в моем случае:

belongs_to :product, -> { unscope(:where) }

на другие ответы стоит посмотреть также, но это - другая опция для направляющих 4.1 +.

6
ответ дан 31 October 2019 в 13:34

В направляющих 4 можно использовать связь с явным необъемом нежелательного фильтра т.е. my_photo.product.unscope(where: :visible)

5
ответ дан 31 October 2019 в 13:34

Другая опция состоит в том, чтобы переопределить метод получателя и не определить объем супер:

class Photo < ActiveRecord::Base
  belongs_to :product

  def product
    Product.unscoped{ super }
  end
end

я столкнулся с той же ситуацией, где у меня был тот связанная модель, которая должна была быть не ограничена по объему, но почти в любом случае этому был нужен объем по умолчанию. Это должно сохранить Вас дополнительные вызовы к неограниченному по объему при использовании assocation метода считывания больше чем в одном месте.

50
ответ дан 31 October 2019 в 13:34

Это не находится по основной теме, а по Вашей проблеме с ActiveRecord#becomes: Мы (надо надеяться), зафиксировали его с инициализатором

 class ActiveRecord::Base

   def becomes_with_association_cache(klass)
     became = becomes_without_association_cache(klass)
     became.instance_variable_set("@association_cache", @association_cache)
     became
   end
   alias_method_chain :becomes, :association_cache

 end

https://gist.github.com/2478161

1
ответ дан 31 October 2019 в 13:34

Другие вопросы по тегам:

Похожие вопросы: