Rails

2010-10-25 13 views
50

'daki sütun adları için diğer ad. Veritabanımda 'delete' veya 'listen-control' gibi sütun adları var. Bunlar değiştirilemez, bu yüzden başvurumdaki problemlerden kaçınmak için isimleri takma ismini almak istiyorum. Rails

Ben the following code buldum ama (2005 Ağustos 5) modası geçmiş ve Rails 3 ile çalışmıyor:

module Legacy 
    def self.append_features(base) 
    super 
    base.extend(ClassMethods) 
    end 
    module ClassMethods 
    def alias_column(options) 
     options.each do |new_name, old_name| 
     self.send(:define_method, new_name) { self.send(old_name) } 
     self.send(:define_method, "#{new_name}=") { |value| self.send("#{old_name}=", value) } 
     end 
    end 
    end 
end 

ActiveRecord::Base.class_eval do 
    include Legacy 
end 

nasıl sütun adlarını diğer ad olabilir? Mümkün mü?

+0

Sorunun 'silme' ve 'dinleme denetimini' kullanarak sütun adlarında ne olduğunu göremiyorum? Bir hatayı mı yoksa başka bir şeyle mi karşılaşıyorsunuz? – Ariejan

+3

Dinleme kontrolü, adında bir tire olduğu için geçersiz bir yakut nesnesi niteliği oluşturması nedeniyle sorunlara neden olur. Ruby, "object.listen-control" öğesini "object.listen, eksi kontrol" olarak yorumlar. Ve silme, ayrılmış bir anahtar kelime olabilir. Bunu neden yapmak istediğini bilmiyorum. Bazen doğru cevap, yakut veya raylarla savaşmaya çalışmaktan vazgeçmektir. –

+0

'define_method (" dinle-control ", Proc. Sorun nerede? – rthbound

cevap

0

Jaime'nin dediği gibi, bu isimler sorunlara neden olabilir.

Bu durumda, bazı mantıklı adlar kullanın. GUI'niz, sütunlarınızın nasıl adlandırıldığını asla göstermemelidir.

Öneriler: is_deleted veya deleted_at,

listen_control Sonra buna göre görünümünü değiştirmek, yani ActiveRecord ve veritabanı mücadele çok daha kolay.

+3

… ve sadece bu isimlerle veritabanında/veritabanından okuyan ve yazan ana uygulama değiştirilsin mi? – user486421

6

Aliasing yöntem adları sorununuzu çözmeyecektir. Yukarıdaki yorumda da belirttiğim gibi, yakut yönteminde veya değişken isimlerinde tire kullanamazsınız, çünkü ruby ​​onları bir "eksi" olarak yorumlayacaktır. böylece:

object.listen-control 

olarak yakut tarafından yorumlanacaktır:

object.listen - control 

ve başarısız olur. Bulduğun kod parçacığı, ruby ​​1.9'dan dolayı başarısız olabilir, 3. raylar değil. Ruby 1.9, 1,'u korunan veya özel yöntemlerle artık 1,8 gibi kullanmanıza izin vermez.

Bu, eski veritabanı sütun adlarının çok hoş görünmediği ve onları temizlemek istediğiniz zamanların olduğunu anlıyorum. "Bellmyer" adlı lib klasöründe bir klasör oluşturun. Ardından "create_alias.rb" adlı bir dosya oluşturun ve bu ekleyin:

class User < ActiveRecord::Base 
    include Bellmyer::CreateAlias 
    create_alias 'name-this', 'name_this' 
end 

Ve düzgün diğer ad olacaktır: Artık yumuşatma ihtiyacı Modelinizdeki

module Bellmyer 
    module CreateAlias 
    def self.included(base) 
     base.extend CreateAliasMethods 
    end 

    module CreateAliasMethods 
     def create_alias old_name, new_name 
     define_method new_name.to_s do 
      self.read_attribute old_name.to_s 
     end 

     define_method new_name.to_s + "=" do |value| 
      self.write_attribute old_name.to_s, value 
     end 
     end 
    end 
    end 
end 

, bunu yapabilirsin. Bu tablo sütunlarına yakut yöntemleri olarak çağırmadan erişmek için read_attribute ve write_attribute ActiveRecord yöntemlerini kullanıyor.

+0

Cevabınız için teşekkürler, ancak çözümünüzü test ettim ve hata mesajı alıyorum: Sözdizimi Hata (/usr/lib/ruby/gems/1.9.1/gems/activemodel-3.0.0/lib/active_model/attribute_methods.rb: 229: sözdizimi hatası, beklenmedik '' gönderme (: vm-şifre =, * args) ^): tanımlarken: alias_attribute "vm_password", "vm-şifre" ve elde etmeye çalışmak "vm_password ". – user486421

+0

Bir çözüm buldum! Yukarıdaki yanıtımı görmek istiyorum. –

+0

Büyük teşekkürler! Bunu test ettim ve şunu bulur: 1. user.rb'de ilk satırı eklemeniz gerekir: 'bellmyer/create_alias.rb' gerektirir 2. Tabloda hiç kimse kayıt olmadığında, yönteminiz düzgün çalışır. Bir veya daha fazla kayıt ile hata alır: ActionView :: Template :: Error (/usr/lib64/ruby/gems/1.9.1/gems/activemodel-3.0.0/lib/active_model/attribute_methods.rb:273: sözdizimi hatası beklenmedik '-', anahtar kelime_end undef: vm-parola?… 3. 'Sil' gibi alan adıyla 'sil' yöntemi adından dolayı işe yaramaz. – user486421

123

Bunu, modelinizde bildirin.

alias_attribute :new_column_name, :column_name_in_db 
+0

Bu yöntem, bir tablo sütununun içinde tire olan bir adın olması durumunda çalışmaz. Bunu kullanabilmek için tablo sütununun geçerli bir yakut yöntemi adıyla eşlenmesi gerekir. –

+1

bu işe yarar mı? 'alias_attribute: 'yeni sütun adı', 'sütun-adı-db' –

+0

: 'foo' ile aynıdır: foo. : 'yeni sütun adı' bir Sembol. Sanırım denemedin. ;) –