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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta