Mysql 如何基于搜索关键字rails从两个表中获取数据

Mysql 如何基于搜索关键字rails从两个表中获取数据,mysql,ruby-on-rails,postgresql,ruby-on-rails-4,postgresql-9.4,Mysql,Ruby On Rails,Postgresql,Ruby On Rails 4,Postgresql 9.4,我有两个表学校和私立学校,它们彼此不相关。我需要做的是从两个表中搜索数据以填充结果 两个表都有属性name,我需要从中获取结果。因此,当用户写入一些关键字时,将从两个表中搜索数据 这是我正在尝试的查询,但它返回错误 查询: User.includes(:schools, :private_schools).where("schools.name = ? or private_schools.name = ?", params[:keyword]) 我了解用户。这类东西也没用,也不需要,但我们

我有两个表
学校
私立学校
,它们彼此不相关。我需要做的是从两个表中搜索数据以填充结果

两个表都有属性
name
,我需要从中获取结果。因此,当用户写入一些关键字时,将从两个表中搜索数据

这是我正在尝试的查询,但它返回错误

查询:

User.includes(:schools, :private_schools).where("schools.name = ? or 
private_schools.name = ?", params[:keyword])
我了解
用户。
这类东西也没用,也不需要,但我们应该如何处理这个问题,同时从两个表中搜索关键字

错误是:

ActiveRecord::PreparedStatementInvalid(在:schools.name=?或private_schools.name=?)中绑定变量的数目错误(1代表2):

根据注释,模型代码为:

私立学校:

class PrivateSchool < ActiveRecord::Base
  belongs_to :teacher
  has_many :private_school_specializations, :dependent => :destroy
  has_many :private_classes
  has_many :invitation_promo_codes
  has_many :popular_schools, as: :resource, :dependent => :destroy
end
班级私立学校:毁灭
有很多私人课程
有很多:邀请和促销代码
有很多:受欢迎的学校,如::资源,:依赖=>:destroy
结束
学校:

class School < ActiveRecord::Base
  belongs_to :user
  has_many :students
  has_many :subjects
  has_many :teachers
  has_many :departments
  has_many :student_ids
  has_many :teacher_ids
  has_many :class_rooms
  has_many :popular_schools, as: :resource, :dependent => :destroy
end
班级学校:destroy
结束
用户:

class用户
我有几件事要告诉你:

  • includes
    用于指定要包括在结果集中的关系。所以你在
    学校
    私立学校
    之间没有任何关系。因此,直截了当地说,您不能像这样查询它,因为您不能在没有任何关系的情况下连接两个表。您可以对每个表
    学校
    私立学校
    进行单独查询

    schools = School.where(name: params[:name])
    schools << PrivateSchool.where(name: params[:name])
    schools.flatten!
    
    这是另一回事。例如:

    User.includes(:posts).where('posts.name = ?', 'example')
    
    帖子
    属于
    用户
    时,将发生的是
    包含
    将加载
    帖子
    ,当您尝试使用
    示例
    名称获取
    帖子
    时,它不会触发任何附加查询,因为它已经加载了该数据。因此,只有当模型之间存在关系时,这才有效

  • 如果
    学校
    私立学校
    的属性相同,则它们可以是一个单一的模型。您只需添加一个属性
    is_private
    ,如果是私立学校,该属性将是布尔值,其值将为
    true
    。(这将取决于您的属性)

  • 错误原因以下查询需要两个参数,每个

    User.includes(:schools, :private_schools).where("schools.name = ? or 
    private_schools.name = ?", params[:keyword])
    
    所以

    或者只是

    User.includes(:schools, :private_schools).where("schools.name = :name or 
    private_schools.name = :name", name: params[:keyword])
    
    还期待着别的什么吗?

    我认识用户。这类东西也没用,也不需要,但我们应该如何处理这个问题,同时从两个表中搜索关键字

    实际上,您的
    用户。
    查询将返回一个用户列表,而不是学校或私立学校列表,因此,如果您不希望看到用户列表,您可能正在查找其他内容。。。也许是学校的名单

    如果您的
    学校
    私立学校
    具有相同的结构,您应该查看并对这两种模式使用相同的表。 目前,您可以执行以下操作:

    def my_result
      schools = School.where(name: params[:name]).to_a
      private_schools = PrivateSchool.where(name: params[:name]).to_a
      schools + private_schools # combine both arrays
    end
    
    如果您要在应用程序中频繁执行类似这样的“复杂”查询,我强烈建议您检查“ransack”gem。它使这样的查询变得轻而易举,代码库也变得干净

    MyModel.search(:private_school_name_or_school_name_cont => params[:q).result
    

    参考:

    张贴这三个项目的代码models@ShamsulHaque添加了模型代码。您希望从这两个表中获得什么?数据输出是否相似?如果没有,则需要两个单独的查询。否则,你可以a。将结果映射到两个数组中并将它们连接起来。因此,您将拥有一个结果数组,而不是一个集合。B运行原始sql查询,以便根据键入的搜索短语从两个表中获取学校名称。如何在同一方法中管理2个查询?你的评论是正确的,有道理的。:)否则之后的事情就是我要找的。因此,运行2个查询并将它们作为1个结果集连接起来。我怎么做?我找到了
    User。
    不是必需的,因为我只想从两个表中查询结果,而不包括
    User
    东西<代码>用户是不需要的,因为我已经在上面发布了相同的内容。如果没有
    用户
    因素,我们可以这样做吗?如果表不相关,您将不得不执行两个单独的查询<代码>用户。将返回这些条件下的用户列表,而不是学校或私立学校列表,因此不确定您在寻找什么是的,我想单独查询,我们可以用相同的方法管理吗?你的评论现在对我有意义了。对不起,我想选择第一种。有没有任何例子可以说明如何在一个方法中运行两个查询来查找搜索关键字?谢谢,您将在一个方法中为它编写两个查询,您可以将它们添加到一个数组中。我已经更新了答案。
    User.includes(:schools, :private_schools).where("schools.name = :name or 
    private_schools.name = :name", name: params[:keyword])
    
    def my_result
      schools = School.where(name: params[:name]).to_a
      private_schools = PrivateSchool.where(name: params[:name]).to_a
      schools + private_schools # combine both arrays
    end
    
    MyModel.search(:private_school_name_or_school_name_cont => params[:q).result