2011-03-18 95 views
36

如何訂購包含的元素我有一個模型關係,其中today有許多tasks在Rails 3中

我試圖檢索用戶的today對象,包括tasks和他們都渲染成JSON。所有這一切都很好,直到我決定我想在today對象內訂購tasks,因爲respond_with block也用於呈現html頁面。有沒有辦法包括tasks並訂購?

我想是這樣的:

class TodaysController < ApplicationController 
    respond_to :html, :json 
    def show 
    @today = Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).order(:priority).first 
    respond_with @today, :include => :tasks 
    end 
end 

這正確檢索一切,但似乎並沒有在所有訂單的任務。

這是我曾經有過(這偉大的工作,但沒有排序):

class TodaysController < ApplicationController 
    respond_to :html, :json 
    def show 
    @today = current_user.today 
    respond_with @today, :include => :tasks 
    end 
end 

我知道我可以檢索數據,這樣事後對其進行排序:

@today = current_user.today 
@today.tasks.sort!{|a,b| a.priority <=> b.priority } 

這工作,並會通過我的測試,但我希望有一個ActiveRecord的方式來解決這個問題。

+0

關於您的最後一行代碼。以下更清楚一點:'@ today.tasks.sort_by(&:priority)'。 – DNNX 2013-05-27 11:45:30

回答

49

Today模型試試這個:

has_many :tasks, :order => 'priority DESC' 

編輯:正如下面的評論中提到,Rails中4+,這是現在:

has_many :tasks, -> { order(:priority => :desc) } 

more info here

+0

非常好,謝謝! – royvandewater 2011-03-20 17:35:01

+5

有沒有其他方法可以做到這一點? – maletor 2013-01-07 21:58:38

+24

在rails 4中,現在已經廢棄了,新的方法是'has_many:tasks, - > {order(:priority =>:desc)}'[read about it here](http://stackoverflow.com/questions/ 18284606 /不推薦使用的警告 - 導軌4模型 - 有序) – Cluster 2014-08-19 05:10:34

35

直接解決辦法是在priority之前包括tasks表名:

Today.where(:user_id => current_user.id).includes(:tasks).order('tasks.priority').first 
# joins(:tasks) is not required 

或者,如果你不希望有表名硬編碼的,你可以用合併範圍從Task型號:

Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first 
# joins(:tasks) here is required 

此外,您還可以添加has_many: todaysUser模型溝where條款做:

current_user.todays.includes(:tasks).order('tasks.priority').first 
# or 
current_user.todays.joins(:tasks).includes(:tasks).merge(Task.order(:priority)).first 

但是如果你只需要/總是優先訂購,並且不需要其他不同的排序,添加orderhas_many :tasks更容易。

+1

我不明白爲什麼向模型添加順序更好。在我看來,排序是視圖的一部分,與任何模型無關。 – 2015-03-24 22:15:29

+0

是的。我的意思是更容易編輯。 – Jack 2015-05-12 08:49:45

+0

@Jack'Today.where(:user_id => current_user.id).joins(:tasks).includes(:tasks)。合併(Task.order(:priority))。第一個'它在軌道上不工作4.2 – Gagan 2017-12-07 10:05:01