Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在不实例化ActiveRecord对象的情况下将ActiveRecord SQL查询转换为哈希数组?_Ruby On Rails_Ruby On Rails 4_Activerecord - Fatal编程技术网

Ruby on rails 如何在不实例化ActiveRecord对象的情况下将ActiveRecord SQL查询转换为哈希数组?

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

我正在为我的db表开发一个使用ActiveRecord模型的rails 4应用程序。 主要的问题是,我的模型非常复杂,我希望在对主要对象进行索引时显示大量信息

例如,假设我有以下表格和列:

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数据库。