Tabla de asociación de consulta de carriles con alias
Tengo una modeloEdge
que pertenece al otro modeloNode
dos veces a través de diferentes claves foráneas:
def Edge < ActiveRecord::Base
belongs_to :first, class_name: 'Node'
belongs_to :second, class_name: 'Node'
end
Y quiero realizar esta consulta usando ActiveRecord:
SELECT * FROM edges INNER JOIN nodes as first ON first.id = edges.first_id WHERE first.value = 5
Encontré la manera de unirme a la asociación usando.joins()
método:
Edge.joins(:first)
Pero esto produce una consulta usando un nombre de tabla, no un nombre de asociación, así que en.where()
método Tengo que usar explícitamente el nombre de la tabla que rompe la abstracción de asociación.
Edge.joins(:first).where(nodes: {value: 5})
También puedo usar explícitamente la consulta SQL en.joins()
Método para definir el alias del modelo:
Edge.joins('INNER JOIN nodes as first ON nodes.id = edges.first_id')
Pero esto rompe aún más abstracción.
Creo que debería existir la manera de definir automáticamente el alias de la tabla en join. O tal vez una forma de escribir tal función por mí mismo. Algo como:
def Edge < ActiveRecord::Base
...
def self.joins_alias
# Generate something like
# joins("INNER JOIN #{relation.table} as #{relation.alias} ON #{relation.alias}.#{relation.primary_key} = #{table}.#{relation.foreign_key}")
end
end
Pero no pude encontrar ninguna información sobre cómo acceder a información sobre una relación específica como su nombre, clave externa, etc. Entonces, ¿cómo puedo hacerlo?
También me parece extraño que una característica tan obvia sea tan complicada que incluso a través de Rails ya esté en su cuarta versión principal. Tal vez me estoy perdiendo algo?