带有别名的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})

我还可以在.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个主要版本上发布了如此明显的功能,却是如此的复杂。也许我想念什么?

RPinel

至于Rails 4.2.1,我相信您不能在joinsActiveRecord中使用别名

如果要按第一个节点查询边缘,则可以按照以下说明进行操作:

Edge.joins(:first).where(nodes: {value: 1})
SELECT "edges".* FROM "edges" INNER JOIN "nodes" ON "nodes"."id" = "edges"."first_id" WHERE "nodes"."value" = 1

但是,如果必须同时使用两个节点进行查询,则仍然可以joins像这样使用

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有别名的联接中的Laravel Eloquent子查询

来自分类Dev

在Rails中查询联接关联

来自分类Dev

查询Rails中的联接关联

来自分类Dev

GORM notIn 带有别名的子查询

来自分类Dev

带有别名的MySQL Concat(Length)

来自分类Dev

带有别名的字典子集

来自分类Dev

如何使用带有别名的子查询更新字段

来自分类Dev

对带有别名的LINQ查询使用自动完成功能

来自分类Dev

原则-从相反的一侧查询带有联接表关联的一对多单向

来自分类Dev

从带有别名的派生表中选择给出错误答案

来自分类Dev

带有联接的子查询中的MySQL参考关联

来自分类Dev

mysql内部联接关联所有元组

来自分类Dev

mysql union全部带有别名,语法错误

来自分类Dev

如何对带有别名的列使用GROUP BY?

来自分类Dev

在 Typescript/Javascript 中导出带有别名的元素

来自分类Dev

具有别名表名称的ActiveRecord查询

来自分类Dev

(对MySQL的MSaccess)具有别名的FROM子查询

来自分类Dev

Flask-SQLAlchemy查询联接关系表

来自分类Dev

没有直接关系的Sql表联接[codeigniter]

来自分类Dev

从现有别名创建别名

来自分类Dev

在Rails中创建一个简单的多对多自联接关联

来自分类Dev

Rails 4 OR查询使用组的联接表并具有

来自分类Dev

mysql查询联接3张表,其中一张表没有关联

来自分类Dev

Rails ActiveRecord:使用联接表上的where查询多对多关联

来自分类Dev

Rails ActiveRecord:使用联接表上的where查询多对多关联

来自分类Dev

POSTGRESQL,无子查询:FROM中的子查询必须具有别名

来自分类Dev

在带有联接表的sqlite中执行选择时,别名列的值为空

来自分类Dev

选择带有联接的查询

来自分类Dev

MySQL查询从具有内部联接,别名的两个表中获取数据

Related 相关文章

热门标签

归档