What have you found for these years?

2008-10-13

named_scope

2008-10-13 updated: 花了四五個小時解決不了 AR 的問題,我決定暫時放棄:

  private
def i_give_up
if self.class == TestActiveRecord
skip "it's toooooo hard to implement this for active record!! patch wanted!"
end
end

[:test_same_pager_with_same_opts,
:test_page_correctness,
:test_condition_chain].each{ |test|
before test.to_sym, :i_give_up
}


2008-10-13 updated: 啊哈哈,原來我又搞錯了,named_scope 要丟 lambda,
丟 block 的話完全是另外一回事。有些地方通用,有些地方完全不同 ~~
有些地方需要 :url => {} 有些地方不用...

*

在相簿裡面我就已經大量使用了 named_scope, 例如:
named_scope :for_visitor, lambda{ |visitor, user|
{:conditions => "permissions.#{user.relationship(visitor)} != 'none'",
:include => :permission}
}

承上篇,在寫 pagify, dm 很輕易地就完成了。
因為 dm 的 model 的 class method 本身就具有 named_scope 的效果。
寫好東西後,直接 include 到 model 裡面就能用了。同時有 class scope 和
collection scope. 實際上是透過 with_scope 這個 private method 做到的,
翻翻程式碼就知道,很清楚,很厲害... 前幾天有稍微看過 merb 的程式碼,我覺得,
dm 比 merb 還厲害得多。雖然說 merb 的架構也確實是比 dm 要來得龐大,
但是 merb 我還是會看到一些,覺得不是那麼好的地方。

而 dm 看來看去都是很驚嘆他的架構,摸摸鼻子這程式我寫不出來。有些地方看看
不太懂他在做什麼,仔細追查和思索之後才會恍然。也想不出更好的辦法。
要擴充 dm 真的是輕而易舉的一件事... 只要有原始碼在手 XD

module DataMapper
module Model
include Pagify::Pagifier
def pagify_pager_create model, opts
Pagify::DataMapperPager.new model, model.query, opts
end
end
end

然而 ar, active_record, 原本覺得他 named_scope 還滿方便的,
也是 rails 2.1 主打的新功能不是?跟 dm 一比完全弱掉 orz
看看這在寫什麼鬼:

class ActiveRecord::Base
extend Pagify::Pagifier

class << self
alias_method :__pagify__, :pagify
end

active_record_base = self

# wrap pagify for named_scope!
named_scope :pagify do |opts|
active_record_base.__pagify__ opts
active_record_base.pagify_pager.opts
end

def self.pagify_pager_create model, opts
Pagify::ActiveRecordPager.new model, opts
end
end

那個 active_record_base = self 是怎麼回事啊...
因為 named_scope 裡面的 message receiver 不是 ActiveRecord::Base 耶。
是個不知道是什麼鬼的 module, 沒有名字。因此,呼叫不到 __pagify__.

但是這樣寫還是行不通!!因為丟進來的 opts 居然也是沒名字的 module 啊!! XD
問題是呼叫的地方,明明是丟 hash 進來啊...
users_A = model.all(:conditions => ['name = ?', 'A']).pagify :page => 1, :per_page => 1

變成無名 module 我要怎麼處理啊??真的要昏倒了...
這 named_scope 根本沒辦法應付複雜操作嘛...
值得慶幸的是相簿還沒用到這麼複雜的操作啦。或是說,will_pagiante 做掉了?
對啊,我怎麼沒想到應該看看 will_paginate 怎麼做的。

怪不得這麼簡單的東西,大家都用 will_paginate 喔?因為其實很難啊 XD
就算用 ar 的 with_scope 好了,也不能用在 collection 上啊。
錯誤訊息一直說 collection 是 array 也很讓人困擾耶...

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0