2014-12-27 49 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