我有一个我称之为“Idee”的模型,我想按日期和受欢迎程度订购此模型(有一个投票系统)。我跟着this railcast。它有效,但只有日期,投票存储在投票表中,这是我的关联:
投票
belongs_to :idee
belongs_to :user
用户 has_many :votes, dependent: :destroy
Idee has_many :votes, dependent: :destroy
而且我不知道我怎么能说Idee是通过投票的顺序,因为投票数是在投票表上而不是在Idee中所以如果我说按投票排序他想找到一个列投票在我的想法。所以这就是我现在所做的:
应用程序助手
def sortable(column, title = nil)
title ||= column.titleize
direction = (column == params[:sort] && params[:direction] == "asc") ? "desc" : "asc"
link_to title, :sort => column, :direction => direction
end
控制器
def publiee
@idees = Idee.order(sort_column + " " + sort_direction)
@activites = Activite.all
end
private
def sort_column
params[:sort] || "created_at"
end
def sort_direction
params[:direction] || "asc"
end
查看
<%= sortable "created_at", "Date" %>
有没有办法按照我现在所做的做到我想做的事情?
PS:我的“Idee”未显示在<table>
答案 0 :(得分:2)
请使用joins
。
def publiee
@idees = Idee.order_idess_by_votes sort_column, sort_direction
@activites = Activite.all
end
Idee
模型中,下面的代码应该scope :order_idess_by_votes, ->(sort_column, direction) { joins(:votes).order("#{order_expr(sort_column, direction)}, COUNT(votes.id) DESC)") }
private
def order_expr sort_column, direction
# list all possible columns that you want to use in ORDER clause
# to SQL
order_mappings = {
'first_name_asc' => 'first_name ASC',
'first_name_desc' => 'first_name DESC',
'created_at_asc' => 'created_at ASC',
'created_at_desc' => 'created_at DESC',
# .....
}
order_mappings["#{sort_column}_{direction}"]
end
答案 1 :(得分:0)
:
Idee
然后在控制器中:
scope :with_votes_count, -> { select("idees.*, count(votes.id) as votes_count").references(:votes).includes(:votes).group('idees.id') }
现在,您所要做的就是将def publiee
@idees = Idee.with_votes_count.order("#{sort_column} #{sort_direction}")
@activites = Activite.all
end
private
def sort_column
column = params[:sort] || 'created_at'
Idee.columns.include?(column) ? column : "created_at"
end
传递给&#34; sort_column
&#34;和votes_count
as&#34; sort_direction
&#34;或&#34; DESC
&#34;因为你希望它能够发挥作用。