ruby-on-rails - Rails查询联接关联表的别名

标签 ruby-on-rails join associations

我有一个通过不同的外键两次属于另一个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个主要版本上发布了如此明显的功能,却是如此的复杂。也许我想念什么?

最佳答案

至于Rails 4.2.1,我相信您在使用ActiveRecord中的joins时不能提供别名。

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

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

关于ruby-on-rails - Rails查询联接关联表的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29375627/

相关文章:

ruby-on-rails - 活跃商家 Paypal 网关安全 header 无效问题

MySQL 查询通过连接返回重复值

mysql - 左连接不起作用

ruby-on-rails - 属于两个模型的模型还是多态关联?

node.js - Sequelize 批量插入与关联

mysql - 在 HasOne 关系中获取关联错误

ruby-on-rails - Friendly_id slugs 不断返回 nil 导致 ActiveRecord 错误

ruby-on-rails - bundle 安装错误,意外 ':'

ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新

sql - 两列的总和,并按另一列进行连接和分组