2008年10月28日 星期二

instance_variable_get,delegate

http://ihower.idv.tw/blog/archives/1719
http://blog.gugl.org/archives/41
http://www.ruby-doc.org/core/classes/Object.html#M000380
http://www.ruby-doc.org/core/classes/Module.html#M001677
http://www.ruby-doc.org/core/classes/Hash.html#M002868


KEYS_MAPPINGS.each do |key, value|
define_method key, lambda { <= 用來生 method 的 method
instance_variable_get('@hash')[value] <= 可以直接拿 @hash instance variable 的 值
}
end



KEYS_MAPPINGS = {
:ask => 'BSELL' , :bid => 'BBUY' ,
:change => 'CHANGE', :high => 'HIGH',
:target_id => 'STKID' , :target_name => 'STKNAME'
}

delegate_opts = MarketData::KEYS_MAPPINGS.keys.reject do |e|
e == :target_id || e== :target_name
end.push(:to => :market_data) <= 呼叫 名為 market_data的 instance _function, 一般常是 has_one :thing 的 thing, 不過一樣意思, 就是叫後面這個 function
delegate *delegate_opts <= delegate_opts = [:ask, :bid, :change, :high, {:to => :market_data}]
<= delegate *delegate_opts 就是 delegate :ask, :bid, :change, :high, :to => :market_data
<= delegate 可以一次傳入多個 parameter
def market_data(key=nil)
@market_data ||= MarketData.target(target_id)
key && @market_data ? @market_data[key] : @market_data <= 有傳 key 跟沒傳key return的東西不同
end



[User model]
has_one :profile

field = Profile.content_columns.inject([]) do |result, column| <= content_columns, 濾掉 _id, _count的那些
result << column.name
end.push(:to => :profile)

delegate *field

User.first.address <= 現在可以直接這樣用了

沒有留言: