加入多个表rails sql查询

时间:2018-04-06 16:46:34

标签: sql ruby-on-rails postgresql ruby-on-rails-5

class Account
 has_many :metadata

class Keys
 has_many :metadata

class Metadatum
 belongs_to :key
 belongs_ to :account

在Metadatum对象中,我会保留有关帐户的其他信息,以供“exapmle' age'。

在Key对象中,我保留有关Metadatum类型的信息。

Metadatum表:

  • ID
  • KEY_ID
  • ACCOUNT_ID

密钥表:

  • 名称
  • DATA_TYPE

我想通过多个元数据搜索帐户。例如

  • Metadatum的价值=' 18'属于Key的名称=' age'
  • Metadatum的价值=' John'属于Key的名字=' first_name'

我的查询是:

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

这是错误的,因为在我看来,它会查找具有key_id和值的Metadatum帐户。没有这样的Metadatum - 每个只有一个key_id和值。

什么是正确的查询?

2 个答案:

答案 0 :(得分:1)

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

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])

答案 1 :(得分:0)

尝试以下

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