[英]How to combine ActiveRecord query results in rails?
我的技能 model 需要 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 })
这个答案可能不是最好的,但它解决了我的问题。
处理两种类型的对象我发现:
@all_values = @regular_values << @extra_values
@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.