ruby - saber - Cómo obtener asociaciones activas de registros a través de la reflexión
requisitos para constituir una asociacion civil en mexico 2018 (3)
Para las columnas normales, puede obtenerlas a través del método de clase de columns
. Sin embargo, las asociaciones se pueden nombrar algo bastante diferente si la opción foreign_key
se establece en el método de relación. Por ejemplo, dado
class Post
has_many :comments, :foreign_key => :message_id # this is a contrived example
end
si hiciera Post.column_names
podría Post.column_names
en message_id
, pero ¿hay alguna manera de obtener comments
?
Para futuros Googlers en Rails 4 la respuesta ahora sería:
Post.reflections[:comments].foreign_key # => "message_id"
Tomado desde aquí: https://.com/a/15364743/2167965
EDITAR:
reflections
, a partir de 4.2, ahora toma cadenas en lugar de símbolos, que es un error divertido de localizar. Si desea seguir usando símbolos, debe cambiar a reflect_on_association(:assoc_name)
. También tenga en cuenta que las reflections
son en realidad la API pública que seguirá informando cosas como HABTM, a pesar de que es todo bajo el capó. Los reflejos que Rails está usando ahora están en _reflections
Para un objeto ActiveRecord que uso:
object._reflections
Entonces, puedo manipular el Hash devuelto. Por ejemplo:
object._reflections.keys.each do |key|
object.public_send(key).destroy_all
end
El ejemplo anterior elimina todas las relaciones de la base de datos.
Model.reflections
brinda información sobre las asociaciones de un modelo. Es una tecla Hash
introducida en el nombre de la asociación. p.ej
Post.reflections.keys # => ["comments"]
Aquí hay un ejemplo de parte de la información a la que se puede acceder:
Post.reflections["comments"].table_name # => "comments"
Post.reflections["comments"].macro # => :has_many
Post.reflections["comments"].foreign_key # => "message_id"
Nota: esta respuesta se ha actualizado para cubrir Rails 4.2 en base a la respuesta de MCB y los comentarios a continuación. En versiones anteriores de Rails, se accedía a la foreign_key
del reflejo usando primary_key_name
en primary_key_name
lugar, y las claves para las reflexiones pueden ser símbolos en lugar de cadenas, dependiendo de cómo se definió la asociación, por ejemplo :comments
lugar de "comments"
.