這次,我們討論一下with_scope
方法。下面的Task
中定義了一個返回所有未完成任務的類方法find_incomplete
。
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete
find_all_by_complete(false, :order => 'created_at DESC')
end
end
在控制器
TasksController
中可以這麼調用:
class TasksController < ApplicationController
def index
@tasks = Task.find_incomplete
end
你一定看出來了,這種實現方式有一個限制,那就是我們無法再向方法中傳遞參數了,比如說我們想指定返回未完成任務中的錢20個。
@tasks = Task.find_incomplete :limit => 20
我們可以通過讓
Task
中的find_incomplete
接受一個哈希參數;然後再方法實現中將傳入的參數合併後傳入find
方法來實現這個功能。當然了,有更優雅的實現方式那就是使用find_scope
方法向find
方法傳遞參數。
class Task < ActiveRecord::Base
belongs_to :project
def self.find_incomplete(options = {})
with_scope :find => options do
find_all_by_complete(false, :order => 'created_at DESC')
end
end
end
當
find
方法執行時會連同with_scope
中指定的條件。這樣一來find_incomplete
方法就能攜帶任何傳入的過濾條件參數了。這一特性在其他的作用域內也能生效。下面的代碼中,我們傳入了限制結果數量的參數。find
方法傳入了兩層作用域:第一層是得到指定項目中的所有未完成任務,第二層是結果限制返回前20個。
@tasks = @project.tasks.find_incomplete :limit => 20
作者授權:You are welcome to post the translated text on your blog as well if the episode is free(not Pro). I just ask that you post a link back to the original episode on railscasts.com.