对表中的关联列进行排序

时间:2016-06-18 22:58:56

标签: ruby-on-rails ruby

我尝试根据228 Sortable Table Columns

进行排序

一切都是正确的,但我不知道如何使用其他模型对相关列进行排序。

# Table name: vacations
#  id        :integer          not null, primary key
#  start_at  :date             not null
#  end_at    :date             not null
#  person_id :integer          not null

我试过用这个:

  = sortable "person.first_name", "Employee"

这不正确。

协会

class Vacation < ActiveRecord::Base   
belongs_to :person 
end

class Person < ActiveRecord::Base
has_many :vacations
end

人员表格架构:

# Table name: people
#
#  id                         :integer          not null, primary key
#  pesel                      :string           not null
#  first_name                 :string           not null
#  last_name                  :string           not null

VacationsController 中的当前索引操作。

def index
    @vacations = Vacation.order(sort_column + ' ' + sort_direction)
                         .paginate(page: params[:page], per_page: 20)
end

排序方法。

  def sort_column
    Vacation.column_names.include?(params[:sort]) ? params[:sort] : 'start_at'
  end

  def sort_direction
    %w(asc desc).include?(params[:direction]) ? params[:direction] : 'asc'
  end

更新

Vacation.joins(:person).column_names

返回:

=> ["id", "start_at", "end_at", "free", "reason", "person_id", "accepted"]

2 个答案:

答案 0 :(得分:1)

如果您正在关注RailsCast中的指南,您应该有一些代码:

@vocations = Vocation.order(params[:sort] + ' ' + params[:direction])

如果您希望按照另一个模型中的列进行排序,在您的案例Person模型中,您必须更新查询以加入people表以使其正常工作。

@vocations = Vocation.includes(:person).order(params[:sort] + ' ' + params[:direction]).references(:people)

在你看来,

= sortable "people.first_name", "Employee"

更新:

您可以更新sort_column以处理联接表的特殊情况:

  JOINED_TABLE_COLUMNS = %w(people.first_name)
  def sort_column
    if JOINED_TABLE_COLUMNS.include?(params[:sort]) || Vacation.column_names.include?(params[:sort])
      params[:sort]
    else
      'start_at
    end
  end

答案 1 :(得分:0)

我认为你应该能够解决这个问题:

 = sortable "persons.first_name", "Employee"