【发布时间】:2019-02-24 18:31:16
【问题描述】:
我有一些模型,例如 Service、Payment 和 Manager
class Service < ApplicationRecord
validates :name, presence: true
has_and_belongs_to_many :tickets
has_many :payments
end
class Payment < ApplicationRecord
belongs_to :manager
belongs_to :service
validates :value, :manager_id, :service_id, presence: true
end
class Manager < ApplicationRecord
validates :name, presence: true
end
Service 可以有多个Payment,每个Payment 有一个Manager。
我想使用所有嵌套关联作为哈希来获取整个数据,我可以重新格式化(或映射)并发送给客户端。我被查询困住了:
Service.includes(payments: :manager).references(:payments, :managers)
因为它正在使用延迟加载,所以我需要执行以下操作:
services.first.payments.first.manager
获取数据,并且是非最优的。
是否可以获取所有嵌套关联的所有数据?
我做了这样的计算:
services = Service.includes(payments: :manager)
.references(:payments, :managers)
result = []
services.each do |service|
service.payments.each do |payment|
manager_name = payment[:manager][:name]
value = payment[:value]
service[manager_name] = value
end
result.push(service)
end
得到一个错误NoMethodError (undefined method '[]' for nil:NilClass):
在manager_name = payment[:manager][:name] 线上。
【问题讨论】:
-
我不明白问题出在哪里,您能否显示一些控制台输出以说明您所看到的内容?
-
数据库上有多少服务?解决方案取决于数据的大小。
-
事实上数据的大小并不重要,我想有一个独特的解决方案来一次获取所有数据。请参考已编辑的主题。
-
@Dmitry 不是
service类的Service实例吗?但是您将其视为像service[manager_name] = value这样的哈希。我有点困惑。
标签: ruby-on-rails ruby activerecord rails-activerecord