【问题标题】:Single search box produces "ERROR: column reference "name" is ambiguous"单个搜索框产生“错误:列引用“名称”不明确”
【发布时间】:2016-08-13 20:27:38
【问题描述】:

我正在尝试使用单个搜索字段来过滤Railscasts 240 之后的任何列。定义搜索功能的关键部分在 Contact 模型中。

  def self.search(search)
    if search
      joins(:school).where(['name ILIKE ? OR email ILIKE ? OR school.name ILIKE ?', "%#{search}%", "%#{search}%", "%#{search}%"])
    else
      all
    end
  end

这在没有 join 和 school.name 的情况下有效。联系人属于学校,并且有一个 school_id 列。确切的错误是:

PG::AmbiguousColumn: ERROR:  column reference "name" is ambiguous

我猜这个模棱两可的错误是因为我试图同时搜索 contact.name 和 school.name。正在寻找一个建议以允许在不添加其他搜索字段或需要用户指定搜索类型的情况下同时进行搜索。

编辑:

以下使用contact.name 处理歧义的好建议,但这会导致另一个错误:

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "contact"
LINE 1: ...ON "schools"."id" = "contacts"."school_id" WHERE (contact.na...
                                                             ^
: SELECT  "contacts".* FROM "contacts" INNER JOIN "schools" ON "schools"."id" = "contacts"."school_id" WHERE (contact.name ILIKE '%joseph%' OR email ILIKE '%joseph%' OR school.name ILIKE '%joseph%')  ORDER BY name asc LIMIT 50 OFFSET 0

我认为这是由于内部联接将整个查询移动到学校表中,但即使我删除其他两个查询并仅搜索 school.name,错误仍然存​​在。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql search join


    【解决方案1】:

    模棱两可的错误是由于 PG 不知道查询引用哪个 name 列 - contacts.nameschools.name。您可以通过将查询更改为:

    joins(:school).where(['contacts.name ILIKE ? OR email ILIKE ? OR schools.name ILIKE ?', "%#{search}%", "%#{search}%", "%#{search}%"])
    

    【讨论】:

    • 此建议有效,但会产生另一个错误。请参见上文。
    • Contact 模型存储数据的表名为contacts,而不是contact。请参考错误消息返回的 sql 查询字符串:SELECT "contacts".* FROM "contacts" INNER JOIN "schools" ON "schools"."id" = "contacts"."school_id" WHERE(联系方式.name ILIKE 等
    • 绝对应该仔细阅读。这很有趣,因为 ruby​​ 语法是contact.name 或contact.school.name。谢谢!
    【解决方案2】:

    如果同名的列更多,则必须添加别名

    试试这个,我加contacts.name

     def self.search(search)
        if search
          joins(:school).where(['contacts.name ILIKE ? OR email ILIKE ? school.name ILIKE ?', "%#{search}%", "%#{search}%", "%#{search}%"])
        else
          all
        end
      end
    

    【讨论】:

    • 此建议有效,但会产生另一个错误。请参见上文。
    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多