我试图使用单个搜索字段来过滤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.
歧义错误是由于PG不知道查询指向的name
列是- contacts.name
还是schools.name
。您可以通过将查询更改为:
joins(:school).where(['contacts.name ILIKE ? OR email ILIKE ? OR schools.name ILIKE ?', "%#{search}%", "%#{search}%", "%#{search}%"])
如果列名称相同,则必须添加别名
试试这个,我添加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