如何在初始where语句中使用Arel :: Nodes :: TableAlias

Mic*_*cha 12 ruby ruby-on-rails arel table-alias

我坚持这个并且肯定很容易,但我在文档中找不到解决方案.

我有一些树结构和子where where子句,我必须使用"exists"子查询进行过滤:

current_node.children.as("children_nodes").where(Node.where(...).exists)
Run Code Online (Sandbox Code Playgroud)

Node.where.clause已经加入了children_nodes,如果我使用两个不同的模型,它就可以工作.但是我该如何使用别名呢?以上代码将导致:

NoMethodError (undefined method `where' for #<Arel::Nodes::TableAlias
Run Code Online (Sandbox Code Playgroud)

它是如此基本,但我缺少的东西(我太新了).

小智 5

您也许可以使用table_alias可以在 Arel::Table 上调用的属性。

例子:

# works
users = User.arel_table
some_other_table = Post.arel_table
users.table_alias = 'people'
users.join(some_other_table)

# doesn't work
users = User.arel_table.alias('people')
some_other_table = Post.arel_table
users.join(some_other_table)
Run Code Online (Sandbox Code Playgroud)

  • 警告:“arel_table”方法总是返回相同的对象(至少在 Rails 4.2 中),因此更改“table_alias”会产生副作用。使用“User.arel_table.dup”效果很好。 (2认同)

H.E*_*yed 0

as 方法生成一个 arel 对象,该对象没有 where 方法,例如 Relation 对象,Arel 对象生成要执行的 sql 基本上它是一个选择管理器,您可以使用 union 并给它另一个条件,然后使用 to_sql 例如:

arel_obj = current_node.children.as("children_nodes").Union(Node.where(....)

sql_string = arel_obj.to_sql

Node.find_by_sql(sql_string)

这里有一些可能有帮助的链接 http://www.rubydoc.info/github/rails/arel/Arel/SelectManager