Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 动态定义Mongoid模型_Ruby On Rails_Mongoid_Metaprogramming_Metamodel - Fatal编程技术网

Ruby on rails 动态定义Mongoid模型

Ruby on rails 动态定义Mongoid模型,ruby-on-rails,mongoid,metaprogramming,metamodel,Ruby On Rails,Mongoid,Metaprogramming,Metamodel,如果有人能为我批评这种方法,我将不胜感激 我正在构建一个应用程序,用户可以在其中定义多个属性&生成一个表单与用户共享,就像 这是我的方法 用户有多个源&源嵌入了多个源属性 在这里,所有用户定义的字段都存储在SourceAttributes中。当我需要生成表单时,我会像这样动态地生成一个模型 #source.rb def initialize_set model_name = self.set_name.gsub(' ','').classify # Unique Class name kla

如果有人能为我批评这种方法,我将不胜感激

我正在构建一个应用程序,用户可以在其中定义多个属性&生成一个表单与用户共享,就像

这是我的方法

用户有多个源&源嵌入了多个源属性

在这里,所有用户定义的字段都存储在SourceAttributes中。当我需要生成表单时,我会像这样动态地生成一个模型

#source.rb

def initialize_set
model_name = self.set_name.gsub(' ','').classify

# Unique Class name
klass_name = "#{model_name}#{self.user.id}"
object = self

klass = Class.new do
  include Mongoid::Document

 # Collection names have to be set manually or they don't seem to work
  store_in collection: self.collection_name

 # Pick up attributes from SourceAttribute & define fields here
  object.source_attributes.each do |m|
    field m.field_name.gsub(' ','').underscore, type: object.class.mapping[m.field_type]
  end


  def self.collection_name
    self.name.tableize
  end

 end

 # I get a warning here when the class is re-loaded. Should i worry? I'm considering Object.send :remove_const here
 Object.const_set klass_name, klass

end
使用这种方法,我将为用户定义的每个表单创建一个单独的集合。这似乎有效,但我有几个问题

  • 类型安全性
我在上面生成的字段似乎不是类型安全的。我能够将字符串保存在整数字段中

类型似乎设置正确。 我通过调用klass上的字段并检查options[:type]属性来再次检查这一点

我使用的是简单表单&它不能自动识别类型。我必须用as明确地提到它:

  • 可扩展性
我不确定我动态生成模型的方法是否正确。我以前从未见过有人用过这个

转到另一个问题。请查看评论。

更新1:

所以我错了。我的模型是类型安全的,但它似乎默默地失败了。有没有办法让它抛出异常

# age is correctly defined as an Integer
klass.fields.slice "age"
=> {"age"=>#<Mongoid::Fields::Standard:0xb7edf64 @name="age", @options={:type=>Integer, :klass=>Engineer50bc91a481ee9e19ab000006}, @label=nil, @default_val=nil, @type=Integer>}

# silently sets age to 0
 klass.create!(age: "ABC")
 => #<Engineer50bc91a481ee9e19ab000006 _id: 50cff12181ee9e16f1000003, _type: nil, employee_code: nil, name: nil, age: 0, years: nil, number: nil>

 # returns true when saved
 object = klass.new
 object.age = "ABC"
  => "ABC" 
 object.save
  => true 
我试图通过使用这样的验证来克服这个问题

object.model_attributes.where(field_type: "Number").map(&:field_name).each do |o|
 validates_numericality_of o.gsub(' ','').underscore.to_sym
end
不幸的是,这也会检查是否存在。我试过这个方法

validates_numericality_of o.gsub(' ','').underscore.to_sym, allow_nil: true
但这完全忽略了数值性验证。试着让你也空白,没有运气。

我关于数值性验证的问题需要一个单独的问题。请找同样的
object.model_attributes.where(field_type: "Number").map(&:field_name).each do |o|
 validates_numericality_of o.gsub(' ','').underscore.to_sym
end
validates_numericality_of o.gsub(' ','').underscore.to_sym, allow_nil: true