2012-09-07 14 views
13

Quiero saber el nombre de campo correspondiente a la leyenda de tabla para un modelo dado en Rails.Obtener campo de clave foránea de asociaciones en Rails

Estoy mostrando subtítulos utilizando un modelo de consulta.

query.columns.map {| q | q.caption}
=> [ "Tracker", "Estado", "Prioridad", "Asunto", "cesionario", "Versión prevista", "Fecha de vencimiento", "% Hecho"]

columna tiene nombres que corresponden a los subtítulos

query.columns.map {| q | q.name}
=> [: tracker,: estado,: prioridad: sujeto,: assigned_to,: fixed_version,: DUE_DATE,: done_ratio]

Mi modelo se parece

Issue.columns.map {| q | q.nombre}
=> ["id", "id_tracker", "id_proyecto", "asunto", "descripción", "fecha_deudo", "id_categoría", "id_de_statudo", "asignado_a_idido", "id_prioridad", " fixed_version_id", "author_id", "created_on", "updated_on", "fecha_inicial", "done_ratio", "estimated_hours", "parent_id"]

Quiero conseguir el nombre del campo (el nombre del campo db) correspondiente a un título de la información anterior.

asociación de la muestra en el modelo

belongs_to :assigned_to, :class_name => 'Principal', :foreign_key => 'assigned_to_id' 

Así que para la asociación anterior quiero saber la clave externa.

para assigned_to quiero 'assigned_to_id'

Respuesta

15

El hash reflections ejerce en este tipo de información:

Issue.reflections['assigned_to'].foreign_key 

También puede obtener otra información, tal como la clase (.active_record) o el tipo de asociación (.macro) Antes de los rieles 4.2, las claves de este hash son símbolos y no cadenas.

+0

Esto funcionó para mí ... Issue.reflections [: assigned_to] .OPTIONS [: foreign_key] .. gracias –

1

La forma correcta para rieles 4.2 es:

Issue.reflections['assigned_to'].options[:foreign_key] 

Tenga en cuenta que "assigned_to" es una cadena de acuerdo a API:

Devuelve un hash del nombre de la reflexión como la clave y una AssociationReflection como el valor.

http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html#method-i-reflections

+1

Nota: Esto solo se obtendrán las llaves de encargo extranjeras unidas a las opciones de hash pasó al ayudante de la asociación. Por lo tanto, no funcionará en los casos estándar donde la clave externa se establece automáticamente. Por cierto, la solución de Frederick todavía funciona en Rails 4.2 – MhdSyrwan

+1

¡De hecho! ¡Gracias por anotar! Sin embargo, para hacer que la solución de Frederick funcione en Rails 4.2, el nombre de asociación se debe pasar como una cadena en lugar de un símbolo. –

Cuestiones relacionadas