• <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
            99久久夜色精品国产网站| 欧美黑人激情性久久| 精品无码久久久久久久动漫| 亚洲国产精久久久久久久| 久久精品国产一区二区三区不卡| 亚洲成av人片不卡无码久久| 久久久久国产精品人妻| 久久精品国产99国产精品澳门| 久久影视国产亚洲| 99久久成人国产精品免费| 久久影视综合亚洲| 韩国三级大全久久网站| 伊人色综合久久天天人守人婷| 国产精品久久久久久福利69堂| 欧美国产成人久久精品| 久久亚洲综合色一区二区三区| 亚洲精品tv久久久久久久久久| 久久久久亚洲AV无码永不| 久久亚洲国产精品成人AV秋霞| 久久综合九色综合欧美狠狠| 亚洲精品乱码久久久久久| 久久综合亚洲色HEZYO国产| 久久国产乱子伦精品免费强| 亚洲国产精品无码久久久秋霞2 | 国产精品一区二区久久精品无码| 7777久久久国产精品消防器材| 久久人人爽人人爽人人片AV麻豆| 1000部精品久久久久久久久| 亚洲人成网亚洲欧洲无码久久| 久久久久这里只有精品| 国内精品欧美久久精品| 一本大道久久a久久精品综合 | 久久久久国产精品三级网| 7国产欧美日韩综合天堂中文久久久久| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久亚洲国产精品成人AV秋霞| 色偷偷91久久综合噜噜噜噜| 综合久久给合久久狠狠狠97色| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久精品无码专区免费| 精品99久久aaa一级毛片|