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-я основная версия. Может я что-то упустил?