Ruby on rails Rails基本搜索和PostgreSQL

Ruby on rails Rails基本搜索和PostgreSQL,ruby-on-rails,ruby,ruby-on-rails-3,postgresql,Ruby On Rails,Ruby,Ruby On Rails 3,Postgresql,我正在尝试在我的web应用程序中创建基本搜索。下面是搜索函数的代码 def self.search(title, category_id, city_id) if title || category_id || city_id joins(:category).where('title LIKE (?) AND category.category_id IN (?) AND city.city_id IN (?)', "%#{title}%", "%#{category_id

我正在尝试在我的web应用程序中创建基本搜索。下面是搜索函数的代码

def self.search(title, category_id, city_id)
    if title || category_id || city_id
      joins(:category).where('title LIKE (?) AND category.category_id IN (?) AND city.city_id IN (?)', "%#{title}%", "%#{category_id}%", "%#{city_id}%")
    else
      scoped
    end
  end
我的模型中有以下关联:

  has_one :category
  has_one :city
我得到了这个错误

ActionView::Template::Error (PG::Error: ERROR:  missing FROM-clause entry for ta
ble "category"
LINE 1: ..._id" = "events"."id" WHERE (title LIKE ('%%') AND category.c...

我正在使用PostgreSQL。如何删除此错误?

您使用的
连接的形式需要关联名,SQL需要表名。该表应称为
类别

还有几件事:

  • 我看不到您在任何地方加入
    :city
    ,因此您的下一个错误将是“缺少表“city”的子句条目”。解决方法是加入(:city)
  • ,并在
    的where
    中使用
    cities
    。但仍要继续阅读
  • LIKE的值周围不需要括号,只要
    title LIKE?
    就可以了
  • 您正在为类别和城市使用IN表达式,但您正在为它们提供类似的模式,这是行不通的:ID将是数字,您可以将LIKE与数字一起使用。如果您在中使用,则通常需要提供一个可能值的列表,如果您只想匹配一个值,则只需使用
    =
    和单个值作为p鞋带架
  • categories
    表可能没有
    categories\u id
    列,类似于
    cities
    表和
    city\u id
    列。这两列应该在模型的表中
  • 当你没有头衔的时候,寻找一个头衔没有多大意义。同样地,对于国家和城市来说
  • 这看起来有很多问题,但无需太多努力即可解决:

    def self.search(title, category_id, city_id)
        rel = scoped
        rel = rel.where('title    like ?', "%#{title}%") if(title)
        rel = rel.where('category_id = ?', category_id)  if(category_id)
        rel = rel.where('city_id     = ?', city_id)      if(city_id)
        rel
    end
    

    您甚至不需要
    连接
    或显式表名。

    +100一如既往,mu提供了一个非常优雅的解决方案,并提供了很好的解释。mucasts的时间到了!@Michaeldurrent:谢谢,但我没有“铸造”的声音。