rails find関数
ケース:Modelのfind関数をパラメータ形式で入力したい場合、
例えばargs={:limit=>10}のようにModelを実行する.find(:all,args,:join=>"...")の場合、入力パラメータは機能しません.(:joinは固定)
分析:
ソース:
説明:
(1)extract_options!関数はargsからhashのパラメータをフィルタします
次のようになります.
(2)validate_find_optionsは、optionsにエラーのパラメータが含まれているか否かを検出する.
ソース:
説明:optionsに不正なパラメータが含まれている場合、assert_valid_keys構築放出異常
(3)コードからfindの最初のパラメータは必ずfirst,last,allであることがわかる.
結論:
find関数がextract_を呼び出すとoptions!の場合、入力されるパラメータは({:limit=>10}、:join=>".")です.
返される値は{:join=>"."}です.一方、limit=>10はフィルタリングされたため、10個の記録は返されなかった.
注意:
正しい:find(:all,:limit=>10,:joins=>".(省略).",:conditions => ["fe.event_id = ? ", event.id])
エラー:find(:all,:joins=>".(省略).",:conditions => ["fe.event_id = ? ", event.id], :limit=>10 )
知らない:limitは:conditionsの後でどうして文法の間違いが現れますか?
例えばargs={:limit=>10}のようにModelを実行する.find(:all,args,:join=>"...")の場合、入力パラメータは機能しません.(:joinは固定)
分析:
ソース:
def find(*args)
options = args.extract_options!
validate_find_options(options)
set_readonly_option!(options)
case args.first
when :first then find_initial(options)
when :last then find_last(options)
when :all then find_every(options)
else find_from_ids(args, options)
end
end
説明:
(1)extract_options!関数はargsからhashのパラメータをフィルタします
次のようになります.
extract_options!(1,2,:a => :b) => {:a=>:b}
extract_options!({:a=>:b},:b=>:c) => {:b=>:c}
(2)validate_find_optionsは、optionsにエラーのパラメータが含まれているか否かを検出する.
ソース:
VALID_FIND_OPTIONS = [ :conditions, :include, :joins, :limit, :offset,
:order, :select, :readonly, :group, :from, :lock ]
def validate_find_options(options) #:nodoc:
options.assert_valid_keys(VALID_FIND_OPTIONS)
end
説明:optionsに不正なパラメータが含まれている場合、assert_valid_keys構築放出異常
(3)コードからfindの最初のパラメータは必ずfirst,last,allであることがわかる.
結論:
find関数がextract_を呼び出すとoptions!の場合、入力されるパラメータは({:limit=>10}、:join=>".")です.
返される値は{:join=>"."}です.一方、limit=>10はフィルタリングされたため、10個の記録は返されなかった.
注意:
正しい:find(:all,:limit=>10,:joins=>".(省略).",:conditions => ["fe.event_id = ? ", event.id])
エラー:find(:all,:joins=>".(省略).",:conditions => ["fe.event_id = ? ", event.id], :limit=>10 )
知らない:limitは:conditionsの後でどうして文法の間違いが現れますか?