Sql 在Activerecord中使用两个属性生成IN语句

Sql 在Activerecord中使用两个属性生成IN语句,sql,ruby-on-rails,postgresql,activerecord,where-in,Sql,Ruby On Rails,Postgresql,Activerecord,Where In,我已经尝试了一段时间,但似乎无法在Activerecord中正确使用它 给定asset\u id和asset\u type对的数组,查询同时具有这两个属性的类,仅当asset\u id和asset\u type匹配时 所以考虑到数组 [[4,“徽标”],[1,“图像”]] 我想生成SQL 在((4,'Logo'),(1,'Image'))中的((资产id,资产类型)中选择“资产附件”。*从“资产附件”中选择 我可以手动输入一个字符串,如下所示: 资产附加。其中((4,'Logo'),(

我已经尝试了一段时间,但似乎无法在Activerecord中正确使用它

给定
asset\u id
asset\u type
对的数组,查询同时具有这两个属性的类,仅当
asset\u id
asset\u type
匹配时

所以考虑到数组


[[4,“徽标”],[1,“图像”]]

我想生成SQL


在((4,'Logo'),(1,'Image'))中的((资产id,资产类型)中选择“资产附件”。*从“资产附件”中选择

我可以手动输入一个字符串,如下所示:


资产附加。其中((4,'Logo'),(1,'Image'))中的((资产id,资产类型)

但我尝试将其用于任意长度和资产类型/id的数组

到目前为止我已经试过了


资产附加。其中([:资产id,:资产类型]=>[[4,“徽标”],[1,“图像”])


NoMethodError:未定义的方法“to_sym”,用于[:asset_id,:asset_type]:数组


资产附加。其中(“(资产id,资产类型)”=>[[4,“徽标”],[1,“图像”])


ActiveRecord::StatementInvalid:PG::Error:Error:列资产\附件(资产\ id,资产\类型)不存在


资产附加。其中((?),[4,“徽标”],[1,“图像”])中的((资产id,资产类型)


ActiveRecord::PreparedStatementInvalid:在(?,)中的:(资产id,资产类型)中绑定变量的数量错误(1代表2)

有人知道怎么做吗?提前感谢

设置与阵列 问题的核心是:您正在以一种不可能的方式混合集合数组

elem IN(…)
。。需要一个集合。
elem=ANY(…)
。。需要一个数组

您可以使用将数组转换为集合。
可以使用将集合转换为数组

错误 这里,您正试图从
(资产id,资产类型)
形成一个数组:

。。这是不可能的,因为数组必须由相同的类型组成,而我们显然要处理一个数字和一个字符串常量(您对实际类型保密)

在这里,通过双引号将
(资产id,资产类型)
强制为单列名称:

最后,这里尝试为两个
提供一个绑定变量:

有效SQL 在纯SQL中,以下任一项都可以工作:

SELECT * FROM asset_attachments
WHERE  (asset_id, asset_type) IN ((4, 'Logo'), (1, 'Image'));

SELECT * FROM asset_attachments
WHERE  (asset_id, asset_type) IN (VALUES(4, 'Logo'), (1, 'Image'));

SELECT * FROM asset_attachments
WHERE  (asset_id, asset_type) = ANY (ARRAY[(4, 'Logo'), (1, 'Image')]);
如果您有一长串可能的匹配项,那么显式的
JOIN
会更快:

SELECT *
FROM   asset_attachments
JOIN   (VALUES(4, 'Logo'), (1, 'Image')) AS v(asset_id, asset_type)
                                       USING (asset_id, asset_type)
AR的有效语法 我是博士后的专家,AR不多。这种简单的形式可能有效:

AssetAttachment.where("(asset_id,asset_type) IN ((?,?),(?,?))", 4,"Logo",1,"Image")
不确定这是否可行,也不确定单引号或双引号:

AssetAttachment.where((:asset_id, :asset_type) => [(4,'Logo'),(1,'Image')])
集合与数组 问题的核心是:您正在以一种不可能的方式混合集合数组

elem IN(…)
。。需要一个集合。
elem=ANY(…)
。。需要一个数组

您可以使用将数组转换为集合。
可以使用将集合转换为数组

错误 这里,您正试图从
(资产id,资产类型)
形成一个数组:

。。这是不可能的,因为数组必须由相同的类型组成,而我们显然要处理一个数字和一个字符串常量(您对实际类型保密)

在这里,通过双引号将
(资产id,资产类型)
强制为单列名称:

最后,这里尝试为两个
提供一个绑定变量:

有效SQL 在纯SQL中,以下任一项都可以工作:

SELECT * FROM asset_attachments
WHERE  (asset_id, asset_type) IN ((4, 'Logo'), (1, 'Image'));

SELECT * FROM asset_attachments
WHERE  (asset_id, asset_type) IN (VALUES(4, 'Logo'), (1, 'Image'));

SELECT * FROM asset_attachments
WHERE  (asset_id, asset_type) = ANY (ARRAY[(4, 'Logo'), (1, 'Image')]);
如果您有一长串可能的匹配项,那么显式的
JOIN
会更快:

SELECT *
FROM   asset_attachments
JOIN   (VALUES(4, 'Logo'), (1, 'Image')) AS v(asset_id, asset_type)
                                       USING (asset_id, asset_type)
AR的有效语法 我是博士后的专家,AR不多。这种简单的形式可能有效:

AssetAttachment.where("(asset_id,asset_type) IN ((?,?),(?,?))", 4,"Logo",1,"Image")
不确定这是否可行,也不确定单引号或双引号:

AssetAttachment.where((:asset_id, :asset_type) => [(4,'Logo'),(1,'Image')])

听起来好像您正在尝试使用ActiveRecord中的PG特定功能。一般来说,大多数ORM为支持的数据库之间共享的功能提供了最小公分母接口,所以我认为这是不可能的,至少在rails 3中是这样。Rails 4应该有一个改进的PG适配器,它可以支持类似于PG的功能,因此值得一看。这在vanilla SQL中是不可能的吗?听起来好像您正在尝试使用ActiveRecord中特定于PG的功能。一般来说,大多数ORM为支持的数据库之间共享的功能提供了最小公分母接口,所以我认为这是不可能的,至少在rails 3中是这样。Rails 4应该有一个改进的PG适配器,它可以支持类似于PG的功能,因此值得一看。这在香草SQL中是不可能的吗?