我有接下来的两个模型:
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') %>
答案 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?