Aksine her modelde endişe dahil daha, bir ActiveRecord
submodule oluşturma öneririm ve onunla ActiveRecord::Base
uzatmak ve daha sonra dahil yapar (include_importable
diyelim) o alt modülün bir yöntemi ekleyin. Daha sonra, alan adını bu yönteme argüman olarak iletebilirsiniz ve yöntemde, Importable
sınıf ve örnek yöntemlerinde başvuru için alan adını kaydetmek için bir örnek değişkeni ve erişimcisi (örneğin, importable_field
) tanımlayın.
Yani böyle bir şey: Eğer (
ActiveRecord::Base.extend(Importable::ActiveRecord)
:
Daha sonra bu modül ile
ActiveRecord
uzatmak gerekir
module Importable
extend ActiveSupport::Concern
module ActiveRecord
def include_importable(field_name)
# create a reader on the class to access the field name
class << self; attr_reader :importable_field; end
@importable_field = field_name.to_s
include Importable
# do any other setup
end
end
module ClassMethods
# reference field name as self.importable_field
end
module InstanceMethods
# reference field name as self.class.importable_field
end
end
, bir başlatıcısı (config/initializers/active_record.rb
) bu satırı koyarak söylemek Endişeniz, config.autoload_paths
numaranızdadır, daha sonra, burada gereksinim duymanız gerekmemelidir, aşağıdaki yorumları görün.)
Modellerinizde, imported_field
okuyucu alanının adını döndürür
class MyModel
include_importable 'some_field'
end
Ve: u böyle Importable
yer alacağını sizin InstanceMethods
yılında
MyModel.imported_field
#=> 'some_field'
, daha sonra örneğinde ithal alanın değerini ayarlayabilirsiniz write_attribute
için alanın adını geçirmeden ve almak tarafından yöntemleri değeri read_attribute
kullanarak:
m = MyModel.new
m.write_attribute(m.class.imported_field, "some value")
m.some_field
#=> "some value"
m.read_attribute(m.class.importable_field)
#=> "some value"
Umarım yardımcı olur. Bu sadece benim kişisel aldığım budur, ancak bunu yapmanın başka yolları da vardır (ve ben de onlar hakkında duymak isterim).
Büyük cevap, teşekkür ederim. Hepsi mantıklı. Yarın önerdiğin şeyi deneyeceğim ve bundan sonra çözümü vereceğim. – Col
Her şey çalışıyor ama benim küçük bir sorunum var. Her model dosyasının üstünde özellikle 'kaygılar/içe aktarılabilir' gerektirmedikçe aşağıdaki hatayı alıyorum. NameError: tanımsız yerel değişken veya # yöntemi ''include_importable
Ben şöyle autoload_path için endişeler dizini ekledik : config.autoload_paths + = Dir [" # {config.root}/app/models/**/"] Bu büyük bir sorun değil ama her yerde buna gereksinim duymamayı tercih ediyorum. Baska öneri? – ColSorun, * ActiveRecord :: Base.extend (İçe Aktarılabilir :: ActiveRecord) 'satırı, daha önce çağrılması gereken * * modelleriniz ActiveRecord'un" includes_importable "yöntemine sahip olması için yüklenir. Autoloading çalışmıyor, çünkü '' Importable' modülünün adı model kodunuzda belirtilmemiş. Sorunu çözmenin birkaç yolu var, sanırım en kolayı 'config/initializers/active_record.rb' adresinde bir başlatıcı oluşturmak ve 'extend' satırını oraya taşımak; üst. Daha sonra, modelinizde buna ihtiyacınız olmayacak. –