三种模型关联结果

问题描述 投票:0回答:1

我有三个相关的模型:访问,循环和模拟器。关系如下:

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
ruby-on-rails activerecord
1个回答
1
投票

您可以在此处使用has_many :through association。该关联关系使您可以在VisitSimulator之间建立关系,在这种情况下,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
© www.soinside.com 2019 - 2024. All rights reserved.