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)
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