首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arel、Joins和Rails查询

Arel、Joins和Rails查询
EN

Stack Overflow用户
提问于 2011-02-22 08:08:50
回答 5查看 15.6K关注 0票数 16

我最近被一个问题困扰了一小段时间,并找到了Arel的方法,它看起来应该允许我在查询中执行OR。

作为一个起点,我需要将现有的Rails3查询转换为Arel,这就是我遇到问题的地方。

下面的作用域和查询按照我的预期工作。它为我提供了与特定用户的广告相关的请求。

代码语言:javascript
复制
#in the Request class
scope :responder, lambda { |user| joins(:ad).where(:ads => { :user_id => user }) }

Request.responder(303).to_sql

=> "SELECT \"requests\".* FROM \"requests\" INNER JOIN \"ads\" ON \"ads\".\"id\" = \"requests\".\"ad_id\" WHERE (\"ads\".\"user_id\" = 303)"

根据Arel github页面和Railscast 215上的doco,我应该能够执行类似以下操作来使用Arel复制查询

代码语言:javascript
复制
  requests = Request.arel_table
  ads = Ad.arel_table
  where(requests.join(ads).on(ads[:id].eq(requests[:ad_id])))

这将导致错误

代码语言:javascript
复制
TypeError: Cannot visit Arel::SelectManager

不过,我可以在控制台中执行以下操作

代码语言:javascript
复制
r = Request.arel_table
a = Ad.arel_table

r.join(a).to_sql
 => "SELECT  FROM \"requests\" INNER JOIN \"ads\" "

因此,它看起来像是在形成SQL请求,但是当您将它放在where中时

代码语言:javascript
复制
Request.where(r.join(a)).to_sql

我得到了以下信息

代码语言:javascript
复制
TypeError: Cannot visit Arel::SelectManager....

我已经尝试过在where中执行其他Arel操作,它可以正常工作(例如)

代码语言:javascript
复制
Request.where(r[:status].eq(nil)).to_sql
 => "SELECT \"requests\".* FROM \"requests\" WHERE (\"requests\".\"status\" IS NULL)"

这有点超出了我日益增长的rails/ruby知识。有什么想法吗?

提前谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-22 12:45:46

要在rails 3中执行OR,请查看MetaWhere。上面有一个很好的铁路广播:http://railscasts.com/episodes/251-metawhere-metasearch

票数 1
EN

Stack Overflow用户

发布于 2012-06-01 19:16:25

您可以在Arel::SelectManager上使用join_sources.first,并将其传递给joins

代码语言:javascript
复制
requests = Request.arel_table
ads = Ad.arel_table
Request.joins(requests.join(ads).on(ads[:id].eq(requests[:ad_id])).join_sources.first)
票数 9
EN

Stack Overflow用户

发布于 2011-03-18 05:06:27

这里更大的答案是,尽管这里有一个奇特的、鼓舞人心的例子:http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/

...Active Record实际上并不支持完整的Arel功能。至少,不是通过关系或作用域。您可以在Arel中创建任何(大多数)查询,但最终您将使用:

代码语言:javascript
复制
sql = User.arel_table.(something awesome in Arel).to_sql
users = User.find_by_sql(sql)

从技术上讲,仍然有一个".to_a“方法,但它不返回ActiveRecord模型实例,并且已被弃用。

{更新}

对于ActiveRecord来说,http://erniemiller.org/projects/squeel/是有史以来最好的事情。所有那些Arel的东西都意识到了。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5072709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档