[ruby-on-rails] ¿Qué hace reverse_of do? ¿Qué SQL genera?



Answers

Creo que :inverse_of es más útil cuando trabajas con asociaciones que aún no se han conservado. P.ej:

class Project < ActiveRecord::Base
  has_many :tasks, :inverse_of=>:project
end

class Task < ActiveRecord::Base
  belongs_to :project, :inverse_of=>:tasks
end

Ahora, en la consola:

irb> p = Project.new
=> #<Project id: nil, name: nil, ...>
irb> t = p.tasks.build
=> #<Task id: nil, project_id: nil, ...>
irb> t.project
=> #<Project id: nil, name: nil, ...>

Sin los argumentos: reverse_of, t.project devolvería nil, porque desencadena una consulta sql y los datos aún no se almacenan. Con el argumento: reverse_of, los datos se recuperan de la memoria.

Question

inverse_of girar la cabeza de manera inverse_of y no lo entiendo.

¿Cómo se ve el sql generado, si hay alguno?

¿ inverse_of opción inverse_of exhibe el mismo comportamiento si se usa 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



Por favor, eche un vistazo a 2 dos recursos útiles

Y recuerda algunas limitaciones de inverse_of :

no funciona con: a través de asociaciones.

no funciona con: asociaciones polimórficas.

para las asociaciones belongs_to has_many se ignoran las asociaciones inversas.




Solo una actualización para todos: acabamos de usar inverse_of con una de nuestras aplicaciones con has_many :through asociación

Básicamente hace que el objeto "origen" esté disponible para el objeto "niño"

Entonces, si estás usando el ejemplo 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

El uso de :inverse_of le permitirá acceder al objeto de datos que es el inverso de, sin realizar más consultas SQL







Related