我在Ruby中具有以下模型
class Entity < ActiveRecord::Base
validates :account_type, presence: true
validates :account_id, presence: true
end
我有一系列称为帐户的哈希,类似于:
[{'account_id':44, 'account_type':'user'},..,{'account_id':44, 'account_type':'other'}, {'account_id':88,
'account_type':'another'}]
所以我想要一种方法来获取与accounts数组的元素(account_id和 两者都为account_type)。
我尝试使用此代码:
entities = []
accounts.each do |account|
entities << Entity.where(account_id: ActiveSupport::HashWithIndifferentAccess.new(account)['account_id'])
.where(account_type: ActiveSupport::HashWithIndifferentAccess.new(account)['account_type'])
end
但是有一种方法可以使它更有效?
答案 0 :(得分:2)
为此:
[{'account_id':44, 'account_type':'user'}, {'account_id':44, 'account_type':'other'}, ... ]
您想要的SQL是:
select ...
where account_id = 44 and account_type = 'user'
or account_id = 44 and account_type = 'other'
or ...
请注意,SQL的运算符优先级使其与以下各项相同:
select ...
where (account_id = 44 and account_type = 'user')
or (account_id = 44 and account_type = 'other')
or ...
您可以使用ActiveRecord建立类似的查询,但是由于#or
的工作方式,这有点麻烦:
accounts = your_array_of_hashes
entities = accounts.inject(Entity.none) { |memo, h| memo.or(Entity.where(h)) }
答案 1 :(得分:1)
如果您使用滑轨5,则可以尝试or
。像这样
entities = Entity.none
items.each do |item|
entities = entities.or(Entity.where(item))
end
这只是一个SQL查询,但是如果数组很大,我不知道它是如何工作的。
答案 2 :(得分:0)
如果我遇到您的问题,这应该可以解决:
entities = accounts.map { |acc| Entity.where(account_id: acc['account_id'], account_type: acc['account_type']) }
让我解释发生了什么事
map
返回一个数组,将所有与数据库中的内容匹配的条目map
就像each
一样通过Accounts数组进行插入,这意味着它将把帐户中的数据带到where
查询中comma
条件之间的where
也可以进行比较,除非您正在做or
,在我想可以使用以下语法的情况下:where('account_id = :id or account_type = :type', id: acc['account_id'], type: acc['account_type'])