Rails объединяет таблицу соединений с псевдонимом

У меня есть модельEdge что принадлежит другой моделиNode дважды через разные внешние ключи:

def Edge < ActiveRecord::Base
    belongs_to :first, class_name: 'Node'
    belongs_to :second, class_name: 'Node'
end

И я хочу выполнить этот запрос с помощью ActiveRecord:

SELECT * FROM edges INNER JOIN nodes as first ON first.id = edges.first_id WHERE first.value = 5

Я нашел способ вступить в ассоциацию, используя.joins() метод:

Edge.joins(:first)

Но это производит запрос, используя имя таблицы, а не имя ассоциации, поэтому в.where() метод, который я должен явно использовать имя таблицы, которая нарушает абстракцию ассоциации.

Edge.joins(:first).where(nodes: {value: 5})

Я также могу явно использовать SQL-запрос в.joins() Метод определения псевдонима модели:

Edge.joins('INNER JOIN nodes as first ON nodes.id = edges.first_id')

Но это нарушает еще большую абстракцию.

Я думаю, что должен быть способ автоматически определять псевдоним таблицы при объединении. Или, может быть, способ написать такую ​​функцию самостоятельно. Что-то вроде:

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

Но я не смог найти никакой информации о доступе к информации о конкретном отношении, таком как его имя, внешний ключ и т. Д. Так как я могу это сделать?

Также мне кажется странным, что такая очевидная особенность настолько сложна, что даже через Rails уже есть его 4-я основная версия. Может я что-то упустил?

Ответы на вопрос(1)

Ваш ответ на вопрос