2014-12-27 19 views
1

在ruby中,很常见的是名为klass的变量,它包含类名称的名称。由于class是保留关键字,拼写错误的单词klass可用于此目的。在ruby中命名File类的常用约定

我正在寻找类,我需要为文件对象定义类似的解决方案。

显然

class File 
end 

不会为我工作,因为它会启动猴子修补红宝石的File类,我不打算。

在实践中是否有一个名称是File类常用的名称?我偶然发现了使用Fyle,但不知道这是一个好主意的想法,想检查与社会:)

编辑我使用的1 例。

在我的Rails应用程序中,我有一个包含许多文件的产品模型。还有其他的模型也有文件关联。

所以我要声明我联想这样

class Product 
    has_many :files, as: :file_attachable 
end 

class File # I cannot use `File` because it conflicts with ruby's `File` 
    belongs_to :file_attachable, polymorphic: true 
end 
+1

你能否提供一些具体的例子来说明你要改变或存档的内容? – vee

+0

@vee我现在已经添加了一个示例。请参阅编辑1. – shankardevy

+1

我不知道任何常用的约定,但也许'ProductFile'适合您的用例? –

回答

2

使用模块命名空间。这使您的File类独立于Ruby的标准File类。

例如:

module Foo 
    class File 
    end 
end 

用法:

f = Foo::File.new 

对于Rails的ActiveRecord的,你可以这样做:

module Foo 
    class File < ActiveRecord::Base 
    end 
end 

Rails会自动使用基于类的表名继承自Base,并且基于该模块的而不是名称:

Foo::File.table_name #=> "files" 

您可以提供自己的table_name如果你喜欢定制:

module Foo 
    class File < ActiveRecord::Base 
    self.table_name = "foo_files" 
    end 
end 

协会的工作方式相同:

module Foo 
    class User 
    has_many :files # class is Foo::File 
    end 
end 

您可以提供自己的class_name如果你喜欢定制:

module Foo 
    class User 
    has_many :files, class_name: "Foo::File" 
    end 
end 
+0

命名空间是一个好主意。但是,现在我不得不在轨道模型关联中处理额外的开销。我的意思是我不再可以使用'has_many:fyles',但不得不提及类名,我的表名也应该是'foo_files'等。这是标准方式吗? – shankardevy

+0

我为你添加了更多信息。 Rails为您处理所有这些,并且还可以让您根据自己的喜好进行自定义。 – joelparkerhenderson