我最近被一个问题困扰了一小段时间,并找到了Arel的方法,它看起来应该允许我在查询中执行OR。
作为一个起点,我需要将现有的Rails3查询转换为Arel,这就是我遇到问题的地方。
下面的作用域和查询按照我的预期工作。它为我提供了与特定用户的广告相关的请求。
#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复制查询
requests = Request.arel_table
ads = Ad.arel_table
where(requests.join(ads).on(ads[:id].eq(requests[:ad_id])))这将导致错误
TypeError: Cannot visit Arel::SelectManager不过,我可以在控制台中执行以下操作
r = Request.arel_table
a = Ad.arel_table
r.join(a).to_sql
=> "SELECT FROM \"requests\" INNER JOIN \"ads\" "因此,它看起来像是在形成SQL请求,但是当您将它放在where中时
Request.where(r.join(a)).to_sql我得到了以下信息
TypeError: Cannot visit Arel::SelectManager....我已经尝试过在where中执行其他Arel操作,它可以正常工作(例如)
Request.where(r[:status].eq(nil)).to_sql
=> "SELECT \"requests\".* FROM \"requests\" WHERE (\"requests\".\"status\" IS NULL)"这有点超出了我日益增长的rails/ruby知识。有什么想法吗?
提前谢谢。
发布于 2011-02-22 12:45:46
要在rails 3中执行OR,请查看MetaWhere。上面有一个很好的铁路广播:http://railscasts.com/episodes/251-metawhere-metasearch
发布于 2012-06-01 19:16:25
您可以在Arel::SelectManager上使用join_sources.first,并将其传递给joins
requests = Request.arel_table
ads = Ad.arel_table
Request.joins(requests.join(ads).on(ads[:id].eq(requests[:ad_id])).join_sources.first)发布于 2011-03-18 05:06:27
这里更大的答案是,尽管这里有一个奇特的、鼓舞人心的例子:http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/
...Active Record实际上并不支持完整的Arel功能。至少,不是通过关系或作用域。您可以在Arel中创建任何(大多数)查询,但最终您将使用:
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的东西都意识到了。
https://stackoverflow.com/questions/5072709
复制相似问题