RailsCasts中文版,#5 Using with_scope 對find方法限定作用域

這次,我們討論一下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.

原文鏈接:http://railscasts.com/episodes/5-using-with-scope?view=asciicast

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章