是的,你可以使用 sequel gem 做到这一点。
require 'sequel'
DB = Sequel.sqlite # memory database
DB.create_table :users do
primary_key :id
String :name
end
users = DB[:users] # Create a dataset
users.insert(:name => 'jim')
DB.create_table :contacts do
primary_key :id
String :name
end
contacts = DB[:contacts] # Create a dataset
contacts.insert(:name => 'first')
DB['select (select count(*) from users where name = "jim") as users,
(select count(*) from contacts where name = "first") as contacts'].each do |row|
puts row
end
#{:users=>1, :contacts=>1}
但是应该注意的是,在 sequel 方法中包含原始字符串并不是一个好主意。
它们可以按如下方式提取:
DB['select (select count(*) from users where name = ?) as users,
(select count(*) from contacts where name = ?) as contacts, 'jim', 'first'].each do |row|
puts row
end
还如另一个答案中所述,您可以完全表达此查询,而无需求助于更符合模块精神的 SQL。 :
dataset = DB.select {[
DB[:users].where(name: 'jim').select { count('*') }.as(:users),
DB[:contacts].where(name: 'first').select { count('*') }.as(:contacts)
]}
dataset.sql
# SELECT (SELECT count('*') FROM `users` WHERE (`name` = 'jim')) AS 'users', (SELECT count('*') FROM `contacts` WHERE (`name` = 'first')) AS 'contacts'
dataset.first
# {:users=>1, :contacts=>1}