ruby-on-rails - update - scope rails




Comment utiliser uncscoped sur les relations associées dans Rails3? (5)

Nouvelle réponse

Cette question devrait vous aider à comprendre comment contourner la clause par défaut de votre association.

Il vaut la peine de répéter que si vous devez régulièrement éviter une portée, il devrait probablement être un défaut. Créez une portée non définie par défaut et utilisez-la explicitement dans vos associations.

J'ai une portée par défaut sur les produits en raison de contraintes de sécurité de l'information.

class Product < ActiveRecord::Base
  has_many :photos

  default_scope where('visible = 1')
end

Dans mon modèle photo associé, cependant, je dois également trouver des produits qui ne devraient pas être visibles.

class Photo < ActiveRecord::Base
  belongs_to :product
end

my_photo.product

Dans d'autres cas, je peux utiliser unscoped pour contourner le default_scope, par exemple dans Product.unscoped.find_by_title('abc') . Toutefois:

Comment supprimer la portée lors de l'utilisation des associations d'un enregistrement?

my_photo.unscoped.product n'a pas de sens car my_photo n'a pas de méthode appelée unscoped . my_photo.product.unscoped n'a pas non my_photo.product.unscoped sens, car my_photo.product peut-être déjà nul.


Ce n'est pas sur le sujet principal mais sur votre problème avec ActiveRecord # devient: Nous l'avons (espérons-le) fixé avec un initialiseur

 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


Je suis probablement un peu en retard à la fête, mais il y a quelque temps je me suis retrouvé dans la même situation et j'ai écrit une gemme pour le faire facilement: unscoped_associations .

Usage:

belongs_to :user, unscoped: true

Soutien:

  • appartient à
  • en a un
  • a beaucoup

Les associations polymorphes sont également supportées.


Oh. Je me suis trompé. Pensé ce qui suit ne fonctionnerait pas ... mais il fait:

Product.unscoped do
  my_photo.product
end

Notez que vous devez appeler sans délimitation sur le modèle avec default_scope qui doit être ignoré.

En outre, l'héritage doit être respecté. Si vous avez la class InsuranceProduct < Product and class FinancialProduct < Product et un default_scope dans Product , toutes les deux combinaisons suivantes fonctionneront:

InsuranceProduct.unscoped do
  my_record.insurance_products
end

FinancialProduct.unscoped do
  my_record.financial_products
end

Product.unscoped do
  my_record.products
end

Toutefois, les éléments suivants ne fonctionneront pas bien que la portée soit définie dans Product :

Product.unscoped do
  my_record.financial_products
end

Je suppose que c'est une autre bizarrerie de STI dans Ruby / Rails.


Une autre option est de surcharger la méthode getter et de dé-supercorder:

class Photo < ActiveRecord::Base
  belongs_to :product

  def product
    Product.unscoped{ super }
  end
end

Je me suis retrouvé dans la même situation où j'avais un modèle associé qui devait être non délimité, mais dans presque tous les autres cas, il avait besoin de la portée par défaut. Cela devrait vous faire économiser les appels supplémentaires à non-délimité si vous utilisez le getter d'assocation à plus d'un endroit.





arel