rails find関数


ケース:Modelのfind関数をパラメータ形式で入力したい場合、
例えば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の後でどうして文法の間違いが現れますか?