ruby-on-rails – Rails查询使用别名连接关联表

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails查询使用别名连接关联表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个模型Edge属于另一个模型Node通过不同的外键两次:
  1. def Edge < ActiveRecord::Base
  2. belongs_to :first,class_name: 'Node'
  3. belongs_to :second,class_name: 'Node'
  4. end

而且我想使用ActiveRecord来执行这个查询

  1. SELECT * FROM edges INNER JOIN nodes as first ON first.id = edges.first_id WHERE first.value = 5

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

  1. Edge.joins(:first)

但是这样会产生使用表名称而不是关联名的查询,所以在.where()方法中,我必须明确地使用破坏关联抽象的表名.

  1. Edge.joins(:first).where(nodes: {value: 5})

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

  1. Edge.joins('INNER JOIN nodes as first ON nodes.id = edges.first_id')

但是,这样会更加抽象化.

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

  1. def Edge < ActiveRecord::Base
  2. ...
  3. def self.joins_alias
  4. # Generate something like
  5. # joins("INNER JOIN #{relation.table} as #{relation.alias} ON #{relation.alias}.#{relation.primary_key} = #{table}.#{relation.foreign_key}")
  6. end
  7. end

但是我没有找到有关访问有关特定关系的信息的信息,如名称,外键等.那么我该怎么办?

对于我来说,似乎也很奇怪,即使Rails已经在其第四个主要版本,这样的显着特征也是如此复杂.也许我错过了什么?

解决方法

对于Rails 4.2.1,我相信当使用ActiveRecord的连接时,您不能提供别名.

如果要通过第一个节点查询边缘,您可以像您所说的那样执行:

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

但是如果您必须使用这两个节点进行查询,您仍然可以使用这样的连接:

  1. Edge.joins(:first,:second).where(nodes: {value: 1},seconds_edges: {value: 2})
  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相关文章