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

QueXuQ · 2013年12月19日 · 最后由 serco 回复于 2013年12月20日 · 1920 次阅读

原文: 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 楼 已删除

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

需要 登录 后方可回复, 如果你还没有账号请 注册新账号