aar*_*ell 7 ruby conflict ruby-on-rails classname ruport
我一直在构建一个执行会计功能的Rails应用程序.作为其中的一部分,我有一个带有类名的模型Transaction
.到目前为止一直很好,我已经建立了这个功能一个月左右,一切都按预期工作.
到现在...
我刚刚发现一些使用Ruport库在几个月前开发的旧报告功能已停止工作.看来,Ruport在生成PDF时需要一个也有类/模块命名的库Transaction
.
TypeError in Admin/team reportsController#generate
Transaction is not a module
...
This error occurred while loading the following files:
pdf/writer
transaction/simple
Run Code Online (Sandbox Code Playgroud)
所以,我正在寻找一个快速解决方案.一个希望不涉及重命名我的Transaction
模型和重构最后几周的代码.
期待一些聪明的建议:)
hom*_*ast 13
已经回答和陈旧,但我带着同样的问题来到这里,但以不同的方式解决了它.
我有两个名为Pull和Query的模型.尝试Query.some_static_method()
在Pull中的方法中引用导致Query解析为ActiveRecord::AttributeMethods::Query:Module
.
通过将空命名空间放在它前面来解决它 ::Query.some_static_method()
我认为这个问题归结为需要PDF :: Writer gem的Ruport,后者又需要Transaction :: Simple gem来定义模块Transaction.
在ActiveRecord中肯定有#transaction方法,但我认为Rails中没有Transaction模块或类.我很乐意在那个问题上得到纠正.
命名空间通常是避免这样命名冲突的最佳实践.例如
module Account
class Transaction < ActiveRecord::Base
....
end
end
Run Code Online (Sandbox Code Playgroud)
但是,命名空间ActiveRecord模型可能会引发其他问题.
尽管可能很耗时,但重命名您的交易模型可能是最好的选择.
如果需要,您仍然可以保留现有的事务数据库表,因此您的迁移不需要通过放入self.table_name = "transactions"
模型内部来进行更改.
通过在关联调用中指定class_name,您与其他模型的关联仍可以命名为"transaction(s)".例如
class User < ActiveRecord::Base
has_many :transactions, :class_name => "AccountTransaction"
end
Run Code Online (Sandbox Code Playgroud)
这两个建议可能会或可能不会为您节省一些时间.
归档时间: |
|
查看次数: |
5874 次 |
最近记录: |