我有三个相关的模型:访问,循环和模拟器。关系如下:
class Visit < ActiveRecord::Base
has_many :cycles
end
class Cycle < ActiveRecord::Base
belongs_to :simulator, counter_cache: true
belongs_to :visit
end
class Simulator < ActiveRecord::Base
has_many :cycles
end
[基本上,我在控制器中有一个动作,在该动作中我需要返回一个Visits数组,但是每个控件都必须具有一个称为“ simulators”的键,该键列出了该特定访问所使用的模拟器。模拟器每次访问也可以多次使用,因此结果需要重复数据删除。
我已经尝试了许多方法,但始终坚持采用最佳方法来完成此任务。
实现这一目标的最好,最有效的方法是什么?
Neil
@visitsFromDB = Visit.includes(:cycles).all
@visits = []
@visitsFromDB.each_with_index do |cVisit, index|
@visit = {
id: cVisit.id,
date: cVisit.date,
}
simulators = []
cVisit.cycles.each do |cCycle|
simulators << Simulator.find(cCycle.simulator_id).name
end
simulator.uniq
@visit[:simulators] = simulators
@visits << @visit
end
@visits
更新的脚本:
@visitsFromDB = Visit.includes(:simulators).all
@visits = []
@visitsFromDB.each_with_index do |cVisit, index|
@visit = {
id: cVisit.id,
date: cVisit.date,
park_id: cVisit.park_id
}
simulators = []
cVisit.cycles.each do |cCycle|
simulators << cCycle.simulators.map { |s| s.name }
end
simulators.uniq
raise simulators.to_json
@visit[:simulators] = simulators
raise @visit.to_json
@visits << @visit
end
raise @visits.to_json
@visits
您可以在此处使用has_many :through association。该关联关系使您可以在Visit
和Simulator
之间建立关系,在这种情况下,Rails可以处理当前情况下您必须要做的繁重工作(也可能更有效率)]
Visit
模型将如下更改:
class Visit < ActiveRecord::Base
has_many :cycles
has_many :simulators, through: :cycles
end
这将允许我们直接获取与simulators
相关的visit
。然后,提取逻辑将更改如下:
@visitsFromDB = Visit.includes(:simulators).all
# Now @visitsFromDB.first.simulators would give us the simulators associated with the first visit, without an additional DB call since they are eager loaded