【问题标题】:PG::Error: ERROR: column reference "status" is ambiguous in active_adminPG ::错误:错误:列引用“状态”在active_admin中不明确
【发布时间】:2014-08-04 09:10:05
【问题描述】:

使用rails 3.2active_admin 并在Rents.rb 中对active_admin 使用自定义过滤器时看到PG::Error: ERROR: column reference "status" is ambiguous

filter :travel_car_brand, as: :string
filter :travel_car_model, as: :string

错误指向:

: SELECT COUNT(DISTINCT "rents"."id") FROM "rents" LEFT OUTER JOIN "travels" ON "travels"."id" = "rents"."travel_id" LEFT OUTER JOIN "cars" ON "cars"."travel_id" = "travels"."id" WHERE ("cars"."brand" ILIKE '%mazda%') AND ("startDate" > '2014-08-04 10:15:14 +0200' and status = 'paid'):

有趣的是,上面有status = 'paid',因为我不确定它为什么使用它作为过滤器。

型号

Rent.rb
belongs_to :travel

Travel.rb
has_one :car

rents 表和 travels 表都有 status 属性。

【问题讨论】:

  • 包括travels.statusrents.rents
  • 嘿@dude 我应该在哪里以及如何包含它?谢谢
  • 已经有人回答了
  • “我不确定它为什么使用它作为过滤器。”我建议您找到添加此过滤器的代码行并将其更改为包含相关模型名称。
  • 我想知道你为什么在""中写文字

标签: ruby-on-rails postgresql activeadmin


【解决方案1】:

我见过Lucas' answer,但如果这是一个rails 应用程序,SQL 应该由应用程序生成,而不是硬编码。因此直接更改 SQL 不是解决方案。

相反,我建议您找到添加“付费”过滤器的代码并修改它以声明相关型号名称。

你可能有一个范围:

scope :paid, where(status: 'paid')

将其更改为(例如):

scope :paid, where("model.status = 'paid'")

【讨论】:

  • 虽然我讨厌那些热情洋溢地构建 sql 的应用程序,但它似乎确实是最好的解决方案 ;)
  • 原来范围“下一次出发”的范围是|rents| rents.where("\"startDate\" > '#{Time.now}' and status = 'paid'")#.order("\"startDate\" ASC") end scope "下一个到达" do |rents| rents.where("status = 'paid' AND \"endDate\" > '#{Time.now}'")#.order("\"endDate\" ASC") end 根据您的建议,我将状态更改为租金.status
【解决方案2】:

你需要选择你希望你的属性选择的那个表,或者同时使用这两个

例如

SELECT
COUNT(DISTINCT "rents"."id")
FROM "rents"
LEFT OUTER JOIN "travels" ON "travels"."id" = "rents"."travel_id"
LEFT OUTER JOIN "cars" ON "cars"."travel_id" = "travels"."id"
WHERE ("cars"."brand" ILIKE '%mazda%')
AND ("startDate" > '2014-08-04 10:15:14 +0200') 
AND rents.status = 'paid'

或者如果您同时需要:

SELECT
COUNT(DISTINCT "rents"."id")
FROM "rents"
LEFT OUTER JOIN "travels" ON "travels"."id" = "rents"."travel_id"
LEFT OUTER JOIN "cars" ON "cars"."travel_id" = "travels"."id"
WHERE ("cars"."brand" ILIKE '%mazda%')
AND ("startDate" > '2014-08-04 10:15:14 +0200')
AND rents.status = 'paid'
AND travels.status = 'paid'

【讨论】:

    【解决方案3】:

    您的“状态”列不明确。因为 SQL 无法理解你想要哪一个表的列。 SQL 无法理解的 Rent.status 或 Travels.status。

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 2018-07-02
      • 2018-01-26
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2012-05-31
      • 2013-05-29
      • 1970-01-01
      相关资源
      最近更新 更多