如何从单个模型/表中提取分组结果并提供给视图

时间:2019-02-21 16:13:16

标签: ruby-on-rails

我有一个名为select distinct count(distinct provisionl0_.pl_id) as col_0_0_ from sample_table provisionl0_ where provisionl0_.pl_type=? and ( provisionl0_.pl_date between ? and ? ) 的模型,只有两列:语言和链接,并且希望能够遍历每种语言的每个链接并显示在视图中。即(显然,这不是代码,只是为了说明所需的模式)

Language

提取这些数据然后在视图中呈现的“轨道方式”是什么? (注意:如果数据在两个不同的模型中,但不是这样,我会很容易做到这一点)

1 个答案:

答案 0 :(得分:3)

因此,一种Railsy的方式是在您的控制器中使用以下内容:

@languages = Language.all.group_by(&:language)

这将为您提供按(erm ...)语言语言分组的语言哈希(<-也许将列重命名为name以避免这种歧义?)

# { 'English' => [language_1, language_2, etc...],
#   'French' => [language_3, language_4],
#    etc... }

然后在您看来:

<% @languages.each do |language_name, languages| %>
  <h1>
    <%= language_name %>
  </h1>
  <% languages.each do |language| %>
    <p>
      <%= language.link %>
    </p>
  <% end %>
<% end %>

很明显,HTML标记可以是您想要的任何内容,尽管我希望可以提供一个有用的示例。

但是,这里有一个警告-随着数据库的增长,这可能不是一种有效的工作方式。您最好为链接建立一个单独的模型,在语言和链接之间建立一对多的关系。

例如:

# langage.rb
has_many :links

# link.rb
belongs_to :language

# your controller
@languages = Language.includes(:links)

然后在视图中显示以下内容:

<% @languages.each do |language| %>
  <h1>
    <%= language.language %>
  </h1>
  <% language.links.each do |link| %>
    <p>
      <%= link.url %>
    </p>
  <% end %>
<% end %>