J'essaye de comprendre inverse_of
et je ne comprends pas.
À quoi ressemble le SQL généré, le cas échéant?
Est -ce que l' inverse_of
option de 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 si 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
ruby-on-rails
activerecord
Federico
la source
la source
Je pense que
:inverse_of
c'est plus utile lorsque vous travaillez avec des associations qui n'ont pas encore été maintenues. Par exemple:Maintenant, dans la console:
Sans les
:inverse_of
arguments,t.project
retourneraitnil
, car il déclenche une requête SQL et les données ne sont pas encore stockées. Avec les:inverse_of
arguments, les données sont extraites de la mémoire.la source
:inverse_of
résolu un problème pour moi lors de la création de nouvelles entités parent et enfant sous la même forme.Après ce pr ( https://github.com/rails/rails/pull/9522 ) inverse_of n'est pas nécessaire dans la plupart des cas.
Active Record prend en charge l'identification automatique pour la plupart des associations avec des noms standard. Cependant, Active Record n'identifiera pas automatiquement les associations bidirectionnelles contenant une étendue ou l'une des options suivantes:
Dans l'exemple ci-dessus, une référence au même objet est stockée dans la variable
a
et dans l'attributwriter
.la source
inverse_of
ou non, le résultat poura.first_name == b.author.first_name
est toujours ture.Juste une mise à jour pour tout le monde - nous venons de l'utiliser
inverse_of
avec l'une de nos applications avec unehas_many :through
associationIl met essentiellement l’objet «origine» à la disposition de l’objet «enfant»
Donc, si vous utilisez l'exemple des Rails:
L'utilisation
:inverse_of
vous permettra d'accéder à l'objet de données dont il est l'inverse, sans effectuer d'autres requêtes SQLla source
Lorsque nous avons 2 modèles avec une relation has_many et appartient_to, il est toujours préférable d'utiliser inverse_of qui informe ActiveRecod qu'ils appartiennent du même côté de l'association. Ainsi, si une requête d'un côté est déclenchée, elle sera mise en cache et servira à partir du cache si elle est déclenchée dans la direction opposée. Ce qui améliore les performances. À partir de Rails 4.1, inverse_of sera défini automatiquement, si nous utilisons une clé étrangère ou des changements de nom de classe, nous devons définir explicitement.
Meilleur article pour les détails et l'exemple.
http://viget.com/extend/exploring-the-inverse-of-option-on-rails-model-associations
la source
Jetez un œil à cet article !!
http://gsusmonzon.blogspot.com.br/2011/09/rails-power-of-inverseof.html
la source
Si vous avez une
has_many_through
relation entre deux modèles, Utilisateur et Rôle, et que vous souhaitez valider l'affectation du modèle de connexion par rapport à des entrées non existantes ou non valides avecvalidates_presence of :user_id, :role_id
, c'est utile. Vous pouvez toujours générer un utilisateur @user avec son association@user.role(params[:role_id])
afin que l'enregistrement de l'utilisateur n'entraîne pas un échec de validation du modèle d'affectation.la source
Veuillez jeter un oeil 2 deux ressources utiles
Et rappelez-vous certaines limites de
inverse_of
:la source