解决Rails应用程序中的类名冲突

时间:2010-09-17 13:14:38

标签: ruby-on-rails ruby conflict classname ruport

我一直在构建一个执行会计功能的Rails应用程序。作为其中的一部分,我有一个类名为Transaction的模型。到目前为止一直很好,我已经建立了这个功能一个月左右,一切都按预期工作。

直到现在......

我刚刚发现一些使用Ruport库在几个月前开发的旧报告功能已停止工作。在生成PDF时,Ruport似乎需要一个同时具有名为Transaction的类/模块的库。

TypeError in Admin/team reportsController#generate
Transaction is not a module

...

This error occurred while loading the following files:
  pdf/writer
  transaction/simple

所以,我正在寻找快速解决方案。希望不需要重命名我的Transaction模型并重构最后几周的代码。

期待一些聪明的建议:)

3 个答案:

答案 0 :(得分:13)

已经回答和陈旧,但我带着同样的问题来到这里,但以不同的方式解决了它。

我有两个名为Pull和Query的模型。 尝试在Pull中的方法中引用Query.some_static_method()会导致查询解析为ActiveRecord::AttributeMethods::Query:Module

通过使用::Query.some_static_method()

将空名称空间置于其前面来解决此问题

答案 1 :(得分:7)

我认为问题归结为需要PDF :: Writer gem的Ruport,而gem又需要Transaction :: Simple gem来定义模块Transaction。

ActiveRecord中肯定有#transaction方法,但我认为Rails中没有Transaction模块或类。我很乐意在那个问题上得到纠正。

命名空间通常是避免这样命名冲突的最佳做法。例如。

module Account
  class Transaction < ActiveRecord::Base
    ....
  end
end 

但是,命名空间ActiveRecord模型可能会引发其他问题。

尽管可能很耗时,但重命名您的交易模型可能是最好的选择。

如果需要,您仍然可以保留现有的事务数据库表,因此只需将self.table_name = "transactions"置于模型中即可更改迁移。

通过在关联调用中指定class_name,您与其他模型的关联仍可以命名为“transaction(s)”。 E.g。

class User < ActiveRecord::Base

  has_many :transactions, :class_name => "AccountTransaction"

end

这两个建议可能会或可能不会为您节省一些时间。

答案 2 :(得分:0)

您的问题可能来自于事务也是Rails中的保留字......