有没有一种直接的方法可以避免在查询时示例化对象?
我想得到一个哈希数组,而不是一个没有示例化阶段的ActiveRecord对象数组,以提高性能。
现在,我正在做这个例子:
sql = User.where(name: 'John', ...).to_sql
ActiveRecord::Base.connection.execute(sql).to_a
有没有一个神奇的方法,比如:User.where(name: 'John', ...).skip_instantiation.to_a
?
有没有一种直接的方法可以避免在查询时示例化对象?
我想得到一个哈希数组,而不是一个没有示例化阶段的ActiveRecord对象数组,以提高性能。
现在,我正在做这个例子:
sql = User.where(name: 'John', ...).to_sql
ActiveRecord::Base.connection.execute(sql).to_a
有没有一个神奇的方法,比如:User.where(name: 'John', ...).skip_instantiation.to_a
?
4条答案
按热度按时间bf1o4zei1#
要将SQL结果Map到哈希数组中,可以使用
OpenStruct
类。参见https://ruby-doc.org/stdlib-2.0.0/libdoc/ostruct/rdoc/OpenStruct.html
gblwokeq2#
关于Pluck:https://guides.rubyonrails.org/active_record_querying.html#pluck
如果你想要一个哈希数组,那么:
2guxujil3#
在
ActiveRecord::Relation
类中添加了这个方法:现在我可以在不示例化对象的情况下运行查询:
s6fujrry4#
是,使用
.pluck
、as Ben Stephens outlined。然而,我想更详细地讨论它可能不够的情况。
用例1,如果我想从连接表的列中提取数据,该怎么办?
**A:**简单,使用字符串参数:
Case 2,如果我想提取任意SQL,例如,从JSONB列的哈希中提取一个值,该怎么办?
**A:**有点复杂。首先,
.pluck
不支持任意SQL,所以你必须使用.select
。其次,使用AS something
SQL语句为选择的任意“列”指定一个名称很重要。第三,为了跳过AR对象的示例化,请使用其他人建议的ActiveRecord::Base.connection.execute
。将它们放在一起: