سؤال

أنا أعمل في قاعدة بيانات Oracle Legacy مع اتفاقية تسمية جدول غريبة قليلا حيث يتم بادئ كل اسم عمود مع الجداول الأحرف الأولية - مثل السياسة. poli_id.

لجعل قاعدة البيانات هذه أسهل في العمل مع لدي طريقة SET_Column_PREFIX التي تنشئ مسافات لكل عمود مع إزالتها بادئة. بمعنى آخر:

# Taken from wiki.rubyonrails.org/rails/pages/howtouselegacyschemas
class << ActiveRecord::Base
  def set_column_prefix(prefix)
    column_names.each do |name|
      next if name == primary_key

      if name[/#{prefix}(.*)/e]
        a = $1

        define_method(a.to_sym) do
          read_attribute(name)
        end

        define_method("#{a}=".to_sym) do |value|
          write_attribute(name, value)
        end

        define_method("#{a}?".to_sym) do
          self.send("#{name}?".to_sym)
        end

      end
    end
  end
end

هذا في ملف (INSOST.RB) في LIB / Directory الخاص بي، وهو مطلوب من التكوين / البيئة ..

هذا يعمل بشكل جيد في التنمية، ولكن عندما أحاول تشغيل التطبيق في وضع الإنتاج، أحصل على الخطأ التالي في جميع النماذج الخاصة بي:

dgs@dgs-laptop:~/code/voyager$ RAILS_ENV=production script/server 
=> Booting Mongrel
=> Rails 2.3.2 application starting on http://0.0.0.0:3000
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:1964:in `method_missing': 
undefined method `set_column_prefix' for #<Class:0xb3fb81d8> (NoMethodError)
    from /home/dgs/code/voyager/app/models/agent.rb:16

يتم تشغيل هذا الخطأ بواسطة "CONFIG.CASHE_CLASSES = صحيح" في التكوين / البيئات / الإنتاج. إذا قمت بتعيين هذا ل خاطئة, ، سيتم بدء القضبان، ولكن لن تكون دروس التخزين المؤقت. أنا أظن أن هذا يجعل القضبان ذاكرة التخزين المؤقت لجميع النماذج قبل تشغيل كتلة تهيئة

إذا قمت بنقل "طلب" INSOST.RB "" قبل بدء القضبان :: Bliticizer.Run Block، ثم أحصل على أخطاء لأن Activerecord لم تتم تهيئته بعد:

usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:443:in `load_missing_constant': uninitialized constant ActiveRecord (NameError)
    from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:80:in `const_missing'
    from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:92:in `const_missing'
    from /home/dgs/code/voyager/lib/insoft.rb:1

من أين يجب أن أكون في هذه الطريقة المخصصة ل LIB و SET_Column_PREFIX من أجل التقاطها قبل التخزين المؤقت النماذج، ولكن بعد تحميل ملفات activerecord؟

هتافات

ديف سميلي

هل كانت مفيدة؟

المحلول

من أين يجب أن أكون في هذه الطريقة المخصصة ل LIB و SET_Column_PREFIX من أجل التقاطها قبل التخزين المؤقت النماذج، ولكن بعد تحميل ملفات activerecord؟

حاول إعداد تهيئة. وبعد يمكنك استدعاء IT CONFIG / INVICIZERS / INSOST.RB مع محتويات القرد الخاص بك:

class << ActiveRecord::Base
  def set_column_prefix(prefix)
    column_names.each do |name|
      next if name == primary_key

      if name[/#{prefix}(.*)/e]
        a = $1

        define_method(a.to_sym) do
          read_attribute(name)
        end

        define_method("#{a}=".to_sym) do |value|
          write_attribute(name, value)
        end

        define_method("#{a}?".to_sym) do
          self.send("#{name}?".to_sym)
        end

      end
    end
  end
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top