【问题标题】:Ambiguous column name for associated Model关联模型的不明确列名
【发布时间】:2017-04-10 02:25:16
【问题描述】:

我在查询数据库时遇到错误

hotels = Hotel.joins(:area).where("title LIKE ? OR address LIKE ? OR area.title LIKE ?", "%#{keywords}%", "%#{keywords}%", "%#{keywords}%") if keywords.present?

我得到的错误是

SQLite3::SQLException:不明确的列名:标题:SELECT COUNT(*) FROM "hotels" INNER JOIN "areas" ON "areas"."id" = "hotels"."area_id" WHERE (title LIKE '% a%' OR address LIKE '%a%' OR area.title LIKE '%a%')

我已阅读其他文章,但似乎没有任何效果

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4


    【解决方案1】:

    您必须指定要从哪个表中查找,就像您在上一个 LIKE 语句中所做的那样,您要从 area 表中指定 title

    OR area.title LIKE ?
    

    也许您在查询中使用的两个表中都有一个名为 title 的列,这样 SQLite 不知道在哪个表中查找和运行查询。

    您已经在使用area.title,但不是hotel.title,所以可能有问题,请尝试以这种方式进行查询。

    Hotel.joins(:area).where('hotel.title LIKE ? OR address LIKE ? OR area.title LIKE ?', "%#{keywords}%", "%#{keywords}%", "%#{keywords}%") if keywords.present?
    
    => SELECT "hotels".* FROM "hotels" INNER JOIN "areas" ON "areas"."id" = "hotels"."area_id" WHERE (hotel.title LIKE '%area-title-0%' OR address LIKE '%area-title-0%' OR area.title LIKE '%area-title-0%')
    => #<Hotel::ActiveRecord_Relation:0x3fcd4355198c>
    

    【讨论】:

      【解决方案2】:

      我通过将 Hotel.title 的列名更改为 Hotel.name 和 joins(:area) (单数),因为它属于 Association 然后使用area.title(复数),因为它是一个表。名字

      hotels = Hotel.joins(:area).where("name LIKE ? OR address LIKE ? OR areas.title LIKE ?", "%#{keywords}%", "%#{keywords}%", "%#{keywords}%") if keywords.present?
      

      【讨论】:

      • 虽然这确实有效,但它促成了一个错误的选择。您不必更改列名即可完成这项工作,而应按照@sebastián-palma 的建议选择表格和列。 Hotel.joins(:area).where('hotel.title LIKE ? OR address LIKE ? OR area.title LIKE ?', "%#{keywords}%", "%#{keywords}%", "%#{keywords}%") if keywords.present? 其中"hotel.title" 代表"table.column"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2014-05-29
      相关资源
      最近更新 更多