单个搜索框产生“错误:列引用”名称“含糊不清”

时间:2016-08-13 20:27:39

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

我正在尝试使用单个搜索字段来过滤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,错误仍然存​​在。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

试试这个,我添加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