通过关联表对索引进行排序?

时间:2018-06-23 21:19:14

标签: ruby-on-rails

我有一个索引,显示创建的所有当前“ dproject”。我正在努力能够单击表标题以按该参数对数据进行排序。除了一栏,我已经全部工作了。此列按分配给我们的客户数量显示客户。例如,“客户A”为“ 008”。 “ dprojects”表的一列是客户ID,“ schools”表的一列是ID和客户的实际姓名。

因为它是一个“ dprojects”索引,所以该表是按与客户关联的ID而不是客户名称进行排序的。如何获得按名称按字母顺序排序的信息?这是我的代码:

视图:(dname是学校模型内的客户名称)

<table>
  <thead>
    <tr style="border-bottom: 2px solid black;">
      <th> <%= sortable "scode", "School" %></th>
    </tr>
  </thead>

  <tbody>
    <% @dprojects.where.not(status: "Completed").each do |dproject| %>
      <tr>
        <td width="20%" class="dotted"><%= dproject.school.dname[0,25] + "..." %></td>
      </tr>
    <% end %>
  </tbody>
</table>

型号:

class Dproject < ActiveRecord::Base
    belongs_to :school, foreign_key: 'scode'
end

控制器:

def index
    @dprojects = Dproject.order(params[:sort])
    respond_with(@dprojects)
end

助手:

module DprojectsHelper
    def sortable(column, title = nil)
        title ||= column.titleize
        link_to title, :sort => column
    end
end

我认为我可以用以下行修改视图:

<th> <%= sortable "dproject.school.dname", "School" %></th>

但这不起作用。我想念什么?感谢您的协助!

1 个答案:

答案 0 :(得分:0)

我想是因为dproject.school.dname中没有这样的列(@dprojects)。您需要连接表才能访问模型School的列。

我在模型Book Author上测试了排序,其中Book belongs_to :author与您的模型非常相似。为了使排序有效,我确实喜欢以下内容:

在控制器中有一个联接表,请注意别名(AS):

sort_by =  params[:sort] || 'author_name'
    @books = Book.joins(:author).select('books.name AS book_name, authors.name AS author_name').order(sort_by)

我使用sort_by来避免列name的模棱两可,因为对我来说,两个模型中都有名称列。

然后查看:

<p>id | <%= sortable 'book_name', 'Book' %> | <%= sortable 'author_name', 'Author' %></p>
<% @books.each do |book| %>
  <p><%= book.book_name %> | <%= book.author_name %> </p>
<% end %>