新手问题 #212 Refactoring & Dynamic Delegator 看不懂

QueXuQ · December 19, 2013 · Last by serco replied at December 20, 2013 · 1920 hits

原文: http://railscasts.com/episodes/212-refactoring-dynamic-delegator?autoplay=true

代码从:

class Product < ActiveRecord::Base
  belongs_to :category

  def self.search(params)
    products = scoped
    products = products.where("name like ?", "%" + params[:name] + "%") if params[:name]
    products = products.where("price >= ?", params[:price_gt]) if params[:price_gt]
    products = products.where("price <= ?", params[:price_lt]) if params[:price_lt]    
    products
  end 

end

换成:

class DynamicDelegator < BasicObject
  def initialize(target)
    @target = target
  end  

  def method_missing(*args, &block)
    result = @target.send(*args, &block)
    @target = result if result.kind_of? @target.class
    result
  end
end
class Product < ActiveRecord::Base
  belongs_to :category

  def self.search(params)
    products = scope_builder
    products.where("name like ?", "%" + params[:name] + "%") if params[:name]
    products.where("price >= ?", params[:price_gt]) if params[:price_gt]
    products.where("price <= ?", params[:price_lt]) if params[:price_lt]    
    products
  end 

  def self.scope_builder
    DynamicDelegator.new(scoped)
  end

end

请教这是为什么这样改,英语不太好,看了好几遍视频和文档都搞不懂本质是为什么要这样做?

1 Floor has deleted

这样改就为了一件事,可以少几次 reset products 这个变量

You need to Sign in before reply, if you don't have an account, please Sign up first.