Ransack问题:默认排序

时间:2016-06-17 07:31:24

标签: ruby-on-rails activerecord arel ransack

我有接下来的两个模型:

class Game
  belongs_to :tournament, inverse_of: :games

  validates_presence_of :name
end

class Tournament
  has_many :games, dependent: :destroy

  validates_numericality_of :number
end

所以,我有一个游戏列表,显示他们的锦标赛号码,我希望默认按照锦标赛的号码订购列表。

在我的控制器中,我有类似的东西:

@q = Game.search(params[:q])
@q.sorts = 'tournaments_number' if q.sorts.blank?
@q = @q.result(distinct: true).page(params[:page])

问题是它没有按编号排序列表。看一下查询

    @q = Game.search(params[:q])
    @q.sorts = 'tournaments_number' if q.sorts.blank?
    puts @q.result.to_sql # => SELECT * FROM games
    @q = @q.result(distinct: true).page(params[:page])

但如果我按照游戏领域进行排序,那就很有效:

    @q = Game.search(params[:q])
    @q.sorts = 'name' if q.sorts.blank?
    puts @q.result.to_sql # => SELECT * FROM games ORDER BY name
    @q = @q.result(distinct: true).page(params[:page])

你知道我做错了什么吗?我怎样才能按相关属性排序?

修改

我发现如果我做下一个,订单会有效:

    @q = Game.includes(:tournament).order('tournaments.number').search(params[:q])
    puts @q.result.to_sql # => SELECT * FROM games INNER JOIN tournaments ON games.tournament_id = tournaments.id ORDER BY tournaments.number
    @q = @q.result(distinct: true).page(params[:page])

问题在于,虽然我可以添加一些条件,但我需要让它与ransack一起使用,因为我在其他地方使用了sort_link,而且它无法正常工作。

<%= sort_link(@q, 'tournaments.number') %>

2 个答案:

答案 0 :(得分:0)

执行此操作时会发生什么:

@q = Game.search(params[:q])
@q.sorts = 'tournaments.number' if q.sorts.blank?
@q = @q.result(distinct: true).page(params[:page])

答案 1 :(得分:0)

不应该是@ q.sorts.blank?