Ruby on rails 如何在不实例化ActiveRecord对象的情况下将ActiveRecord SQL查询转换为哈希数组?
我正在为我的db表开发一个使用ActiveRecord模型的rails 4应用程序。 主要的问题是,我的模型非常复杂,我希望在对主要对象进行索引时显示大量信息 例如,假设我有以下表格和列:Ruby on rails 如何在不实例化ActiveRecord对象的情况下将ActiveRecord SQL查询转换为哈希数组?,ruby-on-rails,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby On Rails 4,Activerecord,我正在为我的db表开发一个使用ActiveRecord模型的rails 4应用程序。 主要的问题是,我的模型非常复杂,我希望在对主要对象进行索引时显示大量信息 例如,假设我有以下表格和列: Person: name(string) Address: address(string), person_id(int) EmailAddress: email(string), person_id(int) Email: spam (boolean), email_ad
Person: name(string)
Address: address(string), person_id(int)
EmailAddress: email(string), person_id(int)
Email: spam (boolean), email_address_id(int)
以及两者之间的关系:
person has_many: :email_addresses
person has_one: :address
email_address has_many: :emails
现在我想显示以下信息
person.name
person.address.name
person.email_addresses.count
person.email_addresses.map do |email_address|
email_address.email.where(spam: false).count
end
主要的问题是我有大量的记录,我不想实例化所有的记录(因此我有一些内存问题)。因此,我想知道如何直接做这类事情来获取哈希数组或数组
我用弹拨
获得了开头:
Person.joins(:address).pluck('persons.name, addresses.address')
问题从计数部分开始
有没有人遇到过这样的情况?有没有一种方法可以在不编写完整SQL查询的情况下执行此操作?对于复杂的查询,您不能使用
pull
,但您可以始终使用它来获取所需的列。首先,加入所有需要的表。注意:我加入了两次电子邮件
表,第二次加入了垃圾邮件:false
条件。然后您可以直接从表中或在select
语句中定义列:
persons = Person.joins(:address, email_addresses: :emails).
joins('INNER JOIN emails not_spammy_email_addresses ON emails.email_address_id = email_addresses.id AND emails.spam = 0').
select('persons.name, addresses.address AS address_address,
COUNT(email_addresses.id) AS email_addresses_count,
COUNT(not_spammy_email_addresses.id) AS not_spammy_email_addresses_count')
然后调用结果的列,如下所示:
person = persons.first
person.name
person.address_address # note I'm not using *address* to prevent conflict with the model Adress
person.email_addresses_count
person.not_spammy_email_addresses_count
我相信这是通过
active\u record
和单个查询所能达到的,但我希望看到其他方法。例如,如果使用此查询,您会感觉不那么SQLish。您正在使用的数据库是什么?您好。我有一个postgres数据库。