繁体   English   中英

如何在rails中组合ActiveRecord查询结果?

[英]How to combine ActiveRecord query results in rails?

我的技能 model 需要 2 组值用于业务可操作性:

  1. 一个来自附加的ValuesList object
  2. 其他来自与质量相关的附加值列表

模型如下所示:

class Value < ApplicationRecord
  belongs_to :values_list
end

class ValuesList < ApplicationRecord
  has_many :values, inverse_of: :values_list, dependent: :delete_all
  has_many :skills

  # Extra values for missing answer (quality)
  has_many :skills_values_lists, foreign_key: "values_list_id"
  has_many :referents, class_name: "Skill", through: :skills_values_lists
end

class Skill < ApplicationRecord
  belongs_to :values_list

  # Extra values for missing answer (quality)
  has_many :skills_values_lists, foreign_key: "skill_id"
  has_many :references, class_name: "ValuesList", through: :skills_values_lists
  accepts_nested_attributes_for :skills_values_lists, reject_if: :all_blank, allow_destroy: true
end

多亏了这一点,我可以查询附加到技能的常规值:

@regular_values = @skill.values_list.values

(返回一个 ActiveRecord::Associations::CollectionProxy 对象),

以及来自几个值列表的额外值:

@extra_values = @skill.references.map {|vl| vl.values}

(返回一个包含 1 个 ActiveRecord::Associations::CollectionProxy 对象的数组)。

我想将这两个结果合并到一个 object 中,以便在 classic.each 循环中显示所有可用值的列表。

如何做到这一点?

您可以使用单个查询来获取遍历 values 和 values_list 以及 values_list 和技能之间关联的值:

Value.joins(values_list: :skills).where(skills: { id: skill_id })

这个答案可能不是最好的,但它解决了我的问题。

处理两种类型的对象我发现:

  1. 将数组添加到集合代理将尝试更新源表 => @all_values = @regular_values << @extra_values
  2. 将集合代理添加到数组会返回一个包含所有数据的 collections 数组 => @all_values = @extra_values << @regular_values

选择选项 2,我可以通过嵌套循环列出值:

      <table class="table table-align-top">
        <thead>
          <tr>
            <th class="col-min-nw"><%= t('Code') %></th>
            <th class="col-min-nw"><%= t('Value') %></th>
            <th><%= t('Description') %></th>
            <th class="col-min-nw"><%= t('UpdatedAt') %></th>
          </tr>
        </thead>

        <tbody>
          <% @all_values.each do |value_set| %>
            <% value_set.each do |value| %>
              <tr>
                <td class="no-wrap"><%= value.code %></td>
                <td class="no-wrap"><%= translation_for(value.name_translations) %></td>
                <td class="text-justify text-sm"><%= sanitize translation_for(value.description_translations) %></td>
                <td class="text-right"><%= format_date(value.updated_at) %></td>
              </tr>
            <% end %>
          <% end %>
        </tbody>

      </table>

我希望有人可以提出更聪明的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM