162 votes

Que fait inverse_of ? Quel SQL génère-t-il ?

J'essaie de comprendre inverse_of et je ne comprends pas.

À quoi ressemble le SQL généré, le cas échéant?

L'option inverse_of présente-t-elle le même comportement si elle est utilisée avec :has_many , :belongs_to et :has_many_and_belongs_to ?

Désolé si c'est une question aussi fondamentale.

J'ai vu cet exemple:

 class Player < ActiveRecord::Base
  has_many :cards, :inverse_of => :player
end

class Card < ActiveRecord::Base
  belongs_to :player, :inverse_of => :cards
end
 

136voto

tadman Points 70178

De la documentation, il semble que l' :inverse_of option est une méthode pour éviter les requêtes SQL, ne générant pas d'eux. C'est une allusion à ActiveRecord déjà chargé les données au lieu de chercher à nouveau dans une relation.

Leur exemple:

class Dungeon < ActiveRecord::Base
  has_many :traps, :inverse_of => :dungeon
  has_one :evil_wizard, :inverse_of => :dungeon
end

class Trap < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :traps
end

class EvilWizard < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :evil_wizard
end

Dans ce cas, l'appelant dungeon.traps.first.dungeon doit retourner l'original dungeon objet au lieu de charger une nouvelle comme ce serait le cas par défaut.

51voto

KenB Points 2898

Je pense : inverse_of est très utile lorsque vous travaillez avec les associations qui n’ont pas encore été rendues persistantes. Par exemple :

Maintenant, dans la console :

Sans le : arguments inverse_of, t.project retournerait nulle, parce qu’elle déclenche une requête sql et les données n’est pas encore enregistrées. Avec la : inverse_of arguments, les données est récupéré de la mémoire.

5voto

Rich Peck Points 26701

Juste une mise à jour pour tout le monde - nous venons d'utiliser inverse_of avec l'une de nos applications avec une association has_many :through


Fondamentalement, l'objet "origine" est disponible pour l'objet "enfant"

Donc, si vous utilisez l'exemple de Rails:

 class Dungeon < ActiveRecord::Base
  has_many :traps, :inverse_of => :dungeon
  has_one :evil_wizard, :inverse_of => :dungeon
end

class Trap < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :traps
  validates :id,
      :presence => { :message => "Dungeon ID Required", :unless => :draft? }

  private
  def draft?
      self.dungeon.draft
  end 
end

class EvilWizard < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :evil_wizard
end
 

L'utilisation de :inverse_of vous permettra d'accéder à l'objet de données dont il est l'inverse, sans effectuer aucune autre requête SQL

3voto

Informatom Points 23

Si vous avez une relation has_many_through entre les modèles de remorquage Utilisateur et Rôle et souhaitez valider l'affectation du modèle de connexion avec des entrées non existantes ou non valides avec validates_presence of :user_id, :role_id cela est utile. Vous pouvez toujours générer un utilisateur @user avec son association @user.role(params[:role_id]) et sa sauvegarde n'entraînerait pas l'échec de la validation du modèle d'affectation.

3voto

Samuel G Points 153

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X