2011-05-11 71 views
0

我正在試驗範圍擴展,並想知道我是否可以做這樣的事情。紅寶石在軌道3範圍擴展和包括

class User 
    has_many :tasks 
    belongs_to :klass  

    scope :users_in_klass, lambda {|k| where(:klass_id => k)} do 

    def current_task_report 
     includes(:tasks) 
     users = [] 
     each {|u| 
     user = { 
      :name => u.full_name, 
      :id => u.id, 
      :tasks => u.tasks 
     } 
     users << user 
     } 
     users 
    end 

end 

,並調用它像這樣

u = User.users_in_klass(6899) 
u.current_task_report 

我遇到的問題是,它忽略了包括上預先加載的任務。

User Load (0.5ms) SELECT `users`.* FROM `users` WHERE (`users`.`klass_id` = 6899) 
Task Load (0.4ms) SELECT `tasks`.* FROM `tasks` WHERE (`tasks`.user_id = 46539) 
Task Load (0.2ms) SELECT `tasks`.* FROM `tasks` WHERE (`tasks`.user_id = 46909) 
Task Load (0.2ms) SELECT `tasks`.* FROM `tasks` WHERE (`tasks`.user_id = 46910) 

是我在做什麼正確的?

在附註中,是否有更好的地方放置current_task_report方法?

乾杯,

回答

1

我認爲你需要移動包括語句轉換成你的拉姆達

class User 
    has_many :tasks 
    belongs_to :klass  

    scope :users_in_klass, lambda {|k| includes(:tasks).where(:klass_id => k)} do 

    def current_task_report 
     users = [] 
     each {|u| 
     user = { 
      :name => u.full_name, 
      :id => u.id, 
      :tasks => u.tasks 
     } 
     users << user 
     } 
     users 
    end 

end 
+0

最後檢查了這一點,它的工作原理。謝謝你的幫助。 – Tim 2012-06-12 23:27:04

0

怎麼樣加入這個協會的克拉斯:

class Klass < ActiveRecord::Base 

    has_many :users 
    has_many :tasks, :through => :users 

end 

然後獲取當前的任務報告會是這個樣子:

Klass.find(6899).tasks 

我假設Rails將足夠聰明,可以自動在第一個語句中執行「IN」語句e生成的查詢。

+0

對不起,我的例子是在簡化,我簡單化下來太多。我想做的不僅僅是完成任務。我想知道爲什麼包含(:任務)方法不起作用,直到那時,查詢還沒有運行。 – Tim 2011-05-11 06:22:58