【发布时间】:2015-06-05 04:55:06
【问题描述】:
我有一个模型 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})
我也可以在.joins()方法中显式使用SQL查询来定义模型别名:
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 个主要版本,如此明显的功能却如此复杂。也许我错过了什么?
【问题讨论】:
标签: ruby-on-rails join associations