Estoy tratando de entender inverse_of
y no lo entiendo.
¿Qué aspecto tiene el sql generado, si lo hay?
¿Tiene la inverse_of
opción de mostrar el mismo comportamiento si se utiliza con :has_many
, :belongs_to
y :has_many_and_belongs_to
?
Lo siento si esta es una pregunta tan básica.
Vi este ejemplo:
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
fuente
fuente
Creo que
:inverse_of
es más útil cuando trabajas con asociaciones que aún no se han conservado. P.ej:Ahora, en la consola:
Sin los
:inverse_of
argumentos,t.project
volveríanil
, porque desencadena una consulta sql y los datos aún no se almacenan. Con los:inverse_of
argumentos, los datos se recuperan de la memoria.fuente
:inverse_of
resolvió un problema para mí al crear nuevas entidades principales y secundarias en la misma forma.Después de este pr ( https://github.com/rails/rails/pull/9522 ) no se requiere inverse_of en la mayoría de los casos.
Active Record admite la identificación automática para la mayoría de las asociaciones con nombres estándar. Sin embargo, Active Record no identificará automáticamente las asociaciones bidireccionales que contienen un alcance o cualquiera de las siguientes opciones:
En el ejemplo anterior, una referencia al mismo objeto se almacena en la variable
a
y en el atributowriter
.fuente
inverse_of
o no, el resultadoa.first_name == b.author.first_name
es siempre seguro.Solo una actualización para todos: acabamos de usar
inverse_of
una de nuestras aplicaciones con unahas_many :through
asociaciónBásicamente hace que el objeto "origen" esté disponible para el objeto "hijo"
Entonces, si estás usando el ejemplo de Rails:
El uso
:inverse_of
le permitirá acceder al objeto de datos del que es el inverso, sin realizar más consultas SQLfuente
Cuando tenemos 2 modelos con la relación has_many y belong_to, siempre es mejor usar inverse_of que informa a ActiveRecod de que pertenecen al mismo lado de la asociación. Entonces, si se activa una consulta desde un lado, se almacenará en caché y se servirá desde el caché si se activa desde la dirección opuesta. Lo que mejora en el rendimiento. A partir de Rails 4.1, inverse_of se establecerá automáticamente, si usamos Foreign_key o cambios en el nombre de la clase, debemos establecerlo explícitamente.
El mejor artículo para detalles y ejemplo.
http://viget.com/extend/exploring-the-inverse-of-option-on-rails-model-associations
fuente
¡¡Mira este articulo!!
http://gsusmonzon.blogspot.com.br/2011/09/rails-power-of-inverseof.html
fuente
Si tiene una
has_many_through
relación entre dos modelos, Usuario y Rol, y desea validar la Asignación del modelo de conexión con entradas no válidas o no existentesvalidates_presence of :user_id, :role_id
, es útil. Todavía puede generar un Usuario @usuario con su asociación@user.role(params[:role_id])
para que guardar el usuario no resulte en una validación fallida del modelo de Asignación.fuente
Por favor, eche un vistazo 2 dos recursos útiles
Y recuerda algunas limitaciones de
inverse_of
:fuente