连接多个表rails sql查询

连接多个表rails sql查询,sql,ruby-on-rails,postgresql,ruby-on-rails-5,Sql,Ruby On Rails,Postgresql,Ruby On Rails 5,在Metadatum对象中,我保留有关帐户的附加信息,例如“年龄” 在“关键对象”中,我保留有关图元数据类型的信息 元基准表: 身份证 密钥id 帐号 价值观 键表: 名字 数据类型 我想按多个元数据搜索帐户。比如说 值为'18'的元数据,属于名为'age'的键 值为'John'的元数据,属于名为'first_name'的键 我的问题是: class Account has_many :metadata class Keys has_many :metadata class

在Metadatum对象中,我保留有关帐户的附加信息,例如“年龄”

在“关键对象”中,我保留有关图元数据类型的信息

元基准表:

  • 身份证
  • 密钥id
  • 帐号
  • 价值观
键表:

  • 名字
  • 数据类型
我想按多个元数据搜索帐户。比如说

  • 值为'18'的元数据,属于名为'age'的键
  • 值为'John'的元数据,属于名为'first_name'的键
我的问题是:

class Account
 has_many :metadata

class Keys
 has_many :metadata

class Metadatum
 belongs_to :key
 belongs_ to :account
这是错误的,因为在我看来,它寻找的是一个既有key_id又有value的Metadatum帐户。不存在这样的元数据-每个元数据只有一个键id和值

什么是正确的查询?

尝试以下内容

    accounts.joins(metadata: :key).where("keys.name = ? AND 
    metadata.value = ?", params[:key], params[:value]).where("keys.name 
    = ? AND metadata.value = ?", params[:key1], params[:value1])

如果您想要符合这两个条件的帐户,我将尝试:

accounts.joins(metadata: :key)
        .where("(keys.name = ? AND metadata.value = ?) OR 
                (keys.name = ? AND metadata.value = ?)",  
         params[:key], params[:value], params[:key1], params[:value1])
新尝试(非常难看:)


谢谢,但这不是我想要的,因为如果我搜索“18”(元数据2)岁的“John”(元数据1),我也会收到所有不是“John”的“18”和所有不是“18”的“John”。不,在这种情况下,您的查询应该只是
accounts.joins(metadata::key)。其中(((keys.name=?和metadata.value=?)”,params[:key],params[:value])
您必须根据参数生成动态查询下面是我拥有的sql查询。仍然不会向我显示同时具有metadataSELECT“accounts”的帐户。从“accounts”内部连接“metadata”上的“accounts”;“accounts_id”=“accounts”。“id”和“metadata”。“deleted_at”是“key”上的空内部连接“key”。“id”=“metadata”。“key_id”和“keys”。“deleted_at”在“accounts”中为空,“deleted_at”为空,并且(keys.name='first_name'和metadata.value='Robert')和(keys.name='age'和metadata.value='18')我尝试了第二种方法。我不喜欢这种方法,但可能行得通。
first = Account.joins(metadata: :key).where("keys.name = ? AND metadata.value = ?", params[:key], params[:value])

final = first.joins(metadata : :key).where("keys.name 
= ? AND metadata.value = ?", params[:key1], params[:value1])
first_ids = Account.joins(metadata: :key).where("keys.name = ? AND metadata.value = ?", params[:key], params[:value]).pluck(“accounts.id”)

final = Account.where(id: first_ids).joins(metadata : :key).where("keys.name = ? AND metadata.value = ?", params[:key1], params[:value1])