Sql 在Activerecord中使用两个属性生成IN语句
我已经尝试了一段时间,但似乎无法在Activerecord中正确使用它 给定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'),(
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中是不可能的吗?