#212
18 октября 2010

Рефакторинг и динамическое делегирование

В этом выпуске мы займемся рефакторингом набора запросов Active Record с условиями, используя динамическую делегацию.
Скачать (22.5 МБ, 8:19)

Источники

# rails console 
Product.search({}).class
Object.instance_methods
BasicObject.instance_methods

# products_controller.rb
products</span> = <span class="co">Product</span>.search(params) <span class="c"># models/product.rb</span> <span class="r">def</span> <span class="pc">self</span>.<span class="fu">search</span>(params) products = scope_builder products.where(<span class="s"><span class="dl">&quot;</span><span class="k">name like ?</span><span class="dl">&quot;</span></span>, <span class="s"><span class="dl">&quot;</span><span class="k">%</span><span class="dl">&quot;</span></span> + params[<span class="sy">:name</span>] + <span class="s"><span class="dl">&quot;</span><span class="k">%</span><span class="dl">&quot;</span></span>) <span class="r">if</span> params[<span class="sy">:name</span>] products.where(<span class="s"><span class="dl">&quot;</span><span class="k">price &gt;= ?</span><span class="dl">&quot;</span></span>, params[<span class="sy">:price_gt</span>]) <span class="r">if</span> params[<span class="sy">:price_gt</span>] products.where(<span class="s"><span class="dl">&quot;</span><span class="k">price &lt;= ?</span><span class="dl">&quot;</span></span>, params[<span class="sy">:price_lt</span>]) <span class="r">if</span> params[<span class="sy">:price_lt</span>] products <span class="r">end</span> <span class="r">def</span> <span class="pc">self</span>.<span class="fu">scope_builder</span> <span class="co">DynamicDelegator</span>.new(scoped) <span class="r">end</span> <span class="c"># lib/dynamic_delegator.rb</span> <span class="r">class</span> <span class="cl">DynamicDelegator</span> &lt; <span class="co">BasicObject</span> <span class="r">def</span> <span class="fu">initialize</span>(target) <span class="iv">target = target
end

def method_missing(args, &block)
result = @target.send(
args, &block)
target</span> = result <span class="r">if</span> result.kind_of? <span class="iv">target.class
result
end
end

RSS Feed for Episode Comments 1 comment

1. Kaine Oct 19, 2010 at 07:07

Спасибо за перевод :)
Посмотрел обе версии :)

Оставьте свой комментарий:

(ПРОПУСТИТЕ ЭТО ПОЛЕ)

(необходимо)

(не будет отображаться)


(используйте pastie или gist для вставки кода)



Друзья:
Спонсоры:
Масс-медиа:
Facebook_icon Twitter_icon Vkontakte_icon
Воздай Опенсорсерам