连接多个表rails sql查询
在Metadatum对象中,我保留有关帐户的附加信息,例如“年龄” 在“关键对象”中,我保留有关图元数据类型的信息 元基准表:连接多个表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
- 身份证
- 密钥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])