Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails查询带别名的联接关联表_Ruby On Rails_Join_Associations - Fatal编程技术网

Ruby on rails Rails查询带别名的联接关联表

Ruby 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()方法中,我必须显式使用表名,

我有一个model
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

您可能知道,如何根据其中一列建立订单?