• <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
            最新久久免费视频| 久久香蕉综合色一综合色88| 亚洲国产精品无码久久九九| 国产成人综合久久精品红| 亚洲人成精品久久久久| 国产精品久久久久影院嫩草| 久久亚洲国产精品123区| 午夜精品久久久久久中宇| 久久噜噜电影你懂的| 久久婷婷五月综合成人D啪 | 国产精品久久精品| 久久天天躁狠狠躁夜夜2020老熟妇 | 国内精品久久久久影院薰衣草| 国产亚洲欧美成人久久片| 国内精品久久久久影院薰衣草| 91久久精品视频| 99国产欧美精品久久久蜜芽| 要久久爱在线免费观看| 国产精品无码久久久久| 国内精品久久久久影院一蜜桃| 欧美粉嫩小泬久久久久久久| 国产国产成人精品久久| 亚洲精品乱码久久久久久自慰| 久久e热在这里只有国产中文精品99| 精品久久久久久无码专区不卡 | 久久婷婷色综合一区二区| 国产亚洲美女精品久久久| 久久夜色tv网站| 91久久精品91久久性色| 久久免费的精品国产V∧| 日本WV一本一道久久香蕉| 日韩中文久久| 日韩十八禁一区二区久久| 精品久久久久久国产三级| 国产精品青草久久久久福利99 | 亚洲伊人久久精品影院| 久久久亚洲欧洲日产国码是AV| 欧美亚洲国产精品久久高清| 亚洲精品久久久www| 国内精品人妻无码久久久影院导航| 大香伊人久久精品一区二区|