gpt4 book ai didi

ruby-on-rails-3 - Arel、Joins 和 Rails 查询

转载 作者:行者123 更新时间:2023-12-03 20:24:11 25 4
gpt4 key购买 nike

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

作为起点,我需要将现有的 Rails 3 查询转换为 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 知识。有任何想法吗?

提前致谢。

最佳答案

您可以使用 join_sources.firstArel::SelectManager并通过 this 加入

requests = Request.arel_table
ads = Ad.arel_table
Request.joins(requests.join(ads).on(ads[:id].eq(requests[:ad_id])).join_sources.first)

关于ruby-on-rails-3 - Arel、Joins 和 Rails 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5072709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com