• <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函數的參數搞這么復雜,原因是我想即便是用這段代碼替換庫里面的部分,也不影響原有代碼的正常功能。

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

            已發現的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 閱讀(700) 評論(0)  編輯 收藏 引用 所屬分類: Ruby
            久久一日本道色综合久久| 国产A级毛片久久久精品毛片| 一本一道久久a久久精品综合| 中文字幕无码久久精品青草| 久久精品国产AV一区二区三区| 久久精品人人槡人妻人人玩AV| 精品久久久久久国产免费了| 久久精品国产亚洲αv忘忧草 | 久久精品无码专区免费青青| 国产亚州精品女人久久久久久| 浪潮AV色综合久久天堂| 久久精品国产色蜜蜜麻豆| 国产亚洲精品美女久久久| 噜噜噜色噜噜噜久久| 久久精品成人免费国产片小草| 久久精品一本到99热免费| 2021最新久久久视精品爱| 久久精品成人| 国产高清国内精品福利99久久| 亚洲AV无码久久| 亚洲午夜精品久久久久久浪潮| 国产精品美女久久久网AV| 久久精品国产秦先生| 高清免费久久午夜精品| 香蕉久久夜色精品升级完成| 久久久久99这里有精品10| 欧美午夜A∨大片久久| 久久久免费观成人影院| 狠狠精品干练久久久无码中文字幕| 国产精品久久久久久久久免费| 老色鬼久久亚洲AV综合| 中文字幕久久波多野结衣av| 国产成人综合久久精品红| 久久久国产视频| 无码国内精品久久人妻蜜桃 | 伊人久久综合无码成人网| 综合久久一区二区三区| 久久99热这里只频精品6| 久久伊人亚洲AV无码网站| 亚洲国产成人精品女人久久久| 伊人 久久 精品|