• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            qiezi的學習園地

            AS/C/C++/D/Java/JS/Python/Ruby

              C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::
            這是前段時間有人討論過的問題:
            代碼:

            order = Order.find(1)
            order.update_attribute(:status, 'finished')

            假定orders表有10個字段,你只想更新其中一個,但active record會生成一個更新全部字段的SQL語句,假定其中一個字段值長度是20K,這個負擔可能會有些重。

            我嘗試解決這個問題,寫了個簡單的插件:
            代碼:

            module ActiveRecord
            ? class Base
            ? ? def update_attribute(name, value)
            ? ? ? update_attributes(name => value)
            ? ? end

            ? ? def update_attributes(new_attributes)
            ? ? ? return if new_attributes.nil?
            ? ? ? attributes = new_attributes.dup
            ? ? ? attributes.stringify_keys!
            ? ? ? self.attributes = attributes
            ? ? ? update(attributes)
            ? ? end

            ? ? private
            ? ? ? def update(attrs = nil)
            ? ? ? ? connection.update(
            ? ? ? ? ? "UPDATE #{self.class.table_name} " +
            ? ? ? ? ? "SET #{quoted_comma_pair_list(connection, attributes_with_quotes(false, attrs))} " +
            ? ? ? ? ? "WHERE #{self.class.primary_key} = #{quote(id)}",
            ? ? ? ? ? "#{self.class.name} Update"
            ? ? ? ? )
            ? ? ? ?
            ? ? ? ? return true
            ? ? ? end

            ? ? ? def attributes_with_quotes(include_primary_key = true, attrs = nil)
            ? ? ? ? (attrs || attributes).inject({}) do |quoted, (name, value)|
            ? ? ? ? ? if column = column_for_attribute(name)
            ? ? ? ? ? ? quoted[name] = quote(value, column) unless !include_primary_key && column.primary
            ? ? ? ? ? end
            ? ? ? ? ? quoted
            ? ? ? ? end
            ? ? ? end
            ? end
            end


            attributes_with_quotes函數(shù)的參數(shù)搞這么復雜,原因是我想即便是用這段代碼替換庫里面的部分,也不影響原有代碼的正常功能。

            可以簡單測試一下上面的例子,它生成的SQL語句會簡潔很多,大概是這樣子:
            UPDATE orders SET "status" = 'finished' WHERE id = 1

            已發(fā)現(xiàn)的BUG和修復:

            1、沒有調用validation (by cookoo)。由于原有代碼調用save,而save被覆蓋成有驗證的代碼,所以具有驗證功能。解決辦法是增加一段代碼:

            module?ActiveRecord
            ??module?ValidationsFix
            ????
            def ?self.append_features(base)? # ?:nodoc:
            ??????super
            ??????base.class_eval?do
            ????????alias_method?:update_attributes_without_validation,?:update_attributes
            ????????alias_method?:update_attributes,?:update_attributes_with_validation
            ??????end
            ????end

            ????
            def ?update_attributes_with_validation(new_attributes)
            ??????
            return ? if ?new_attributes.nil?
            ????? attributes = new_attributes.dup
            ????? attributes.stringify_keys!
            ??????self.attributes?
            = ?attributes

            ??????
            if ?valid?
            ????????update_attributes_without_validation(attributes)
            ??????
            else
            ????????
            return ?false
            ??????end
            ????end
            ??end
            end

            ActiveRecord::Base.class_eval?do
            ??include?ActiveRecord::ValidationsFix
            end

            簡單測試通過。

            posted on 2006-08-26 02:10 qiezi 閱讀(698) 評論(0)  編輯 收藏 引用 所屬分類: Ruby
            久久婷婷五月综合97色直播| www亚洲欲色成人久久精品| 中文字幕精品久久久久人妻| 性高朝久久久久久久久久| 久久99精品久久久大学生| 国产99久久精品一区二区| 国产毛片久久久久久国产毛片 | www亚洲欲色成人久久精品| 国产精品久久久天天影视香蕉| 欧美成人免费观看久久| 国产91久久精品一区二区| 热久久视久久精品18| 99久久精品费精品国产一区二区| 亚洲午夜久久久| 久久久久综合网久久| 亚洲AV乱码久久精品蜜桃| 久久亚洲电影| 久久成人精品视频| 久久亚洲精品国产精品| 中文字幕精品久久| 久久国产乱子伦精品免费午夜| 欧美黑人又粗又大久久久| 无码8090精品久久一区| 国产精品成人99久久久久| 无码国内精品久久人妻| 国产精品中文久久久久久久| 久久久久久青草大香综合精品| 精品久久8x国产免费观看| 亚洲AV无码一区东京热久久| 久久婷婷五月综合成人D啪| a级毛片无码兔费真人久久| 久久国产精品99精品国产987| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 99久久精品免费看国产免费| 国产精品免费看久久久| 久久综合狠狠综合久久| 久久亚洲精精品中文字幕| 日韩AV无码久久一区二区| 色综合久久综合中文综合网| 热re99久久精品国99热| 99久久综合狠狠综合久久止|