Ruby on rails Rails查询带别名的联接关联表
我有一个modelRuby on rails Rails查询带别名的联接关联表,ruby-on-rails,join,associations,Ruby On Rails,Join,Associations,我有一个modelEdge,它通过不同的外键属于另一个model节点两次: def Edge < ActiveRecord::Base belongs_to :first, class_name: 'Node' belongs_to :second, class_name: 'Node' end 我找到了使用.joins()方法加入关联的方法: Edge.joins(:first) 但这会生成使用表名而不是关联名的查询,因此在.where()方法中,我必须显式使用表名,
Edge
,它通过不同的外键属于另一个model节点
两次:
def Edge < ActiveRecord::Base
belongs_to :first, class_name: 'Node'
belongs_to :second, class_name: 'Node'
end
我找到了使用.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')
但这打破了更多的抽象
Edge.joins(:first).where(nodes: {value: 5})
我认为应该有一种在联接时自动定义表别名的方法。或者也许是一种自己编写这种函数的方法。比如:
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
def Edge
但是我找不到任何关于访问特定关系的信息的信息,比如它的名称、外键等。所以我该怎么做呢
而且,我觉得奇怪的是,尽管Rails已经是第四大版本,但如此明显的特性却如此复杂。也许我遗漏了什么?至于Rails 4.2.1,我相信在使用ActiveRecord中的
连接时,您无法提供别名
如果要按第一个节点查询边,可以按照所述操作:
Edge.joins(:first).where(nodes: {value: 1})
SELECT "edges".* FROM "edges" INNER JOIN "nodes" ON "nodes"."id" = "edges"."first_id" WHERE "nodes"."value" = 1
但是,如果必须同时使用两个节点进行查询,您仍然可以像下面这样使用连接:
Edge.joins(:first, :second).where(nodes: {value: 1}, seconds_edges: {value: 2})
SELECT "edges".* FROM "edges" INNER JOIN "nodes" ON "nodes"."id" = "edges"."first_id" INNER JOIN "nodes" "seconds_edges" ON "seconds_edges"."id" = "edges"."second_id" WHERE "nodes"."value" = 1 AND "seconds_edges"."value" = 2
您可能知道,如何根据其中一列建立订单?