声明同一模型两次 - Rails
Declare the same model twice - Rails
所以,我有两个模型,出于某些目的,我试图对每个模型声明两次。
由于某种原因,第二个模型无法再次声明,当我在 运行 这一行 - Foo2.first.bar2
时,我收到错误消息:undefined method 'bar2'
第一个模型,但是运行完美:Foo1.first.bar1
任何帮助将不胜感激。
谢谢,
大卫
我的模型看起来像:
在我的 appname/app/models/foo1.rb
:
class Foo1 < ActiveRecord::Base
def bar1
puts 'bar'
end
end
在我的 appname/app/models/foo2.rb
:
class Foo2 < ActiveRecord::Base
def bar2
puts 'bar2'
end
end
在我的 appname/config/initializers/main.rb
中:
require "main_classes"
在我的 appname/lib/main_classes.rb
中:
class Foo1 < ActiveRecord::Base
attr_accessible :foo1_name
end
class Foo2 < ActiveRecord::Base
attr_accessible :foo2_name
end
当我删除所需的行时,它运行完美.. 为什么?
/==========更新=============/
我有 3 个 table:表、列、函数。
在表中我有 table 名称,在列中有列名称、类型等。在 Funcs 中有表功能。
appname/app/func.rb
中的代码:
class Func < ActiveRecord::Base
def foo
puts 'bar'
end
end
在appname/config/initializers/main.rb
中:
require "main_classes"
在appname/lib/main_classes.rb
中:
Table.find_each do |t|
t.columns.where(accessible: true).find_each do |c|
eval "class #{t.name.classify} < ActiveRecord::Base ; attr_accessible :#{c.name.to_sym} ; end ;"
end
end
代码Func.first.foo提高undefined method 'bar'
当我删除所需的行时,它运行完美.. 为什么?
When I remove the required line, it runs perfectly .. why ?
正如我在评论中提到的,答案是 - rails 自动加载机制。
当您引用 class(在您的情况下为 Func
)时,会发生以下两种情况之一:
- 如果class加载了这样的名称,则返回
- 如果未加载,rails 会尝试通过在其
$LOAD_PATH
目录中查找 func.rb
来找到它。如果仍未在那里找到,则会引发 LoadError
。
在您的例子中,Func
是在应用程序启动时定义的(当初始化程序 运行 时)。因此,当您稍后执行 Func.first.foo
时,将返回带有几个 attr_accessible
的普通 Func
。您的 app/models/func.rb
永远不会被评估。
可能的解决方案:配置 classes (http://guides.rubyonrails.org/configuring.html) 的预先加载。
所以,我有两个模型,出于某些目的,我试图对每个模型声明两次。
由于某种原因,第二个模型无法再次声明,当我在 运行 这一行 - Foo2.first.bar2
时,我收到错误消息:undefined method 'bar2'
第一个模型,但是运行完美:Foo1.first.bar1
任何帮助将不胜感激。 谢谢, 大卫
我的模型看起来像:
在我的 appname/app/models/foo1.rb
:
class Foo1 < ActiveRecord::Base
def bar1
puts 'bar'
end
end
在我的 appname/app/models/foo2.rb
:
class Foo2 < ActiveRecord::Base
def bar2
puts 'bar2'
end
end
在我的 appname/config/initializers/main.rb
中:
require "main_classes"
在我的 appname/lib/main_classes.rb
中:
class Foo1 < ActiveRecord::Base
attr_accessible :foo1_name
end
class Foo2 < ActiveRecord::Base
attr_accessible :foo2_name
end
当我删除所需的行时,它运行完美.. 为什么?
/==========更新=============/
我有 3 个 table:表、列、函数。
在表中我有 table 名称,在列中有列名称、类型等。在 Funcs 中有表功能。
appname/app/func.rb
中的代码:
class Func < ActiveRecord::Base
def foo
puts 'bar'
end
end
在appname/config/initializers/main.rb
中:
require "main_classes"
在appname/lib/main_classes.rb
中:
Table.find_each do |t|
t.columns.where(accessible: true).find_each do |c|
eval "class #{t.name.classify} < ActiveRecord::Base ; attr_accessible :#{c.name.to_sym} ; end ;"
end
end
代码Func.first.foo提高undefined method 'bar'
当我删除所需的行时,它运行完美.. 为什么?
When I remove the required line, it runs perfectly .. why ?
正如我在评论中提到的,答案是 - rails 自动加载机制。
当您引用 class(在您的情况下为 Func
)时,会发生以下两种情况之一:
- 如果class加载了这样的名称,则返回
- 如果未加载,rails 会尝试通过在其
$LOAD_PATH
目录中查找func.rb
来找到它。如果仍未在那里找到,则会引发LoadError
。
在您的例子中,Func
是在应用程序启动时定义的(当初始化程序 运行 时)。因此,当您稍后执行 Func.first.foo
时,将返回带有几个 attr_accessible
的普通 Func
。您的 app/models/func.rb
永远不会被评估。
可能的解决方案:配置 classes (http://guides.rubyonrails.org/configuring.html) 的预先加载。