У меня есть объем по умолчанию на продуктах из-за ограничений информационной безопасности.
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
может уже быть ноль.
Я, вероятно, немного опаздываю стороне, но некоторое время назад я оказался в той же ситуации, и я записал драгоценный камень, чтобы сделать это легко: unscoped_associations.
Использование:
belongs_to :user, unscoped: true
Поддержка:
Полиморфные ассоциации также поддерживаются.
Если Вам нужно, чтобы определенная ассоциация всегда была не ограничена по объему, можно не определить объем ее при определении ассоциации:
belongs_to :product, -> { unscope(where: :visible) }
По некоторым причинам, определенное where
ключ не загружался правильно для меня, таким образом, я просто неограниченный по объему все where
, который является другой опцией, которая, оказывается, удается в моем случае:
belongs_to :product, -> { unscope(:where) }
на другие ответы стоит посмотреть также, но это - другая опция для направляющих 4.1 +.
В направляющих 4 можно использовать связь с явным необъемом нежелательного фильтра т.е. my_photo.product.unscope(where: :visible)
Другая опция состоит в том, чтобы переопределить метод получателя и не определить объем супер:
class Photo < ActiveRecord::Base
belongs_to :product
def product
Product.unscoped{ super }
end
end
я столкнулся с той же ситуацией, где у меня был тот связанная модель, которая должна была быть не ограничена по объему, но почти в любом случае этому был нужен объем по умолчанию. Это должно сохранить Вас дополнительные вызовы к неограниченному по объему при использовании assocation метода считывания больше чем в одном месте.
Это не находится по основной теме, а по Вашей проблеме с 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