小编And*_*tin的帖子

Rails使用别名查询连接关联表

我有一个模型Edge属于另一个模型Node两次通过不同的外键:

def Edge < ActiveRecord::Base
    belongs_to :first, class_name: 'Node'
    belongs_to :second, class_name: 'Node'
end
Run Code Online (Sandbox Code Playgroud)

我想使用ActiveRecord执行此查询:

SELECT * FROM edges INNER JOIN nodes as first ON first.id = edges.first_id WHERE first.value = 5
Run Code Online (Sandbox Code Playgroud)

我找到了使用.joins()方法加入关联的方法:

Edge.joins(:first)
Run Code Online (Sandbox Code Playgroud)

但是这会使用表名而不是关联名来生成查询,所以在.where()方法中我必须显式地使用表名来破坏关联抽象.

Edge.joins(:first).where(nodes: {value: 5})
Run Code Online (Sandbox Code Playgroud)

我还可以在.joins()方法中明确使用SQL查询来定义模型别名:

Edge.joins('INNER JOIN nodes as first ON nodes.id = edges.first_id')
Run Code Online (Sandbox Code Playgroud)

但这打破了更多的抽象.

我认为应该有一种方法来自动定义连接上的表别名.或者也许是一种自己编写这种功能的方法.就像是:

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} = …
Run Code Online (Sandbox Code Playgroud)

join ruby-on-rails associations

19
推荐指数
1
解决办法
9495
查看次数

标签 统计

associations ×1

join ×1

ruby-on-rails ×1