2009-11-09 14 views
0

如果我的模式是這樣的:可能使用ActiveRecord :: Migration的基類嗎?

(app/models/letter.rb) 
class Letter < ActiveRecord::Base 
    def cyrilic_equivilent 
    # return somethign similar 
    end 
end 

class A < Letter 
end 

class B < Letter 
end 

可以將我的移民活動也遵循這個模式:

class CreateLetter < ActiveRecord::Migration 
    def self.up 
    create_table :letters do |t| 
     t.timestamps 
    end 
    end 
end 

class CreateA < CreateLetter 
end 

class CreateB < CreateLetter 
end 

回答

1

你正在試圖做的不會在所有的工作是什麼。

運行遷移時,Rails運行up類方法。讓新的遷移繼承另一個遷移的up方法將嘗試兩次創建相同的表。這將導致遷移失敗。

這不是什麼問題。由於遷移工作的方式,Rails將只運行與包含它的文件共享其名稱的類。

看起來你正在試圖做兩件類似的事情之一。

  1. 模型建議單表繼承。 STI需要一個名爲type的字符串列,並且所有的子類都將使用父模型的表格,在這種情況下是字母。你只需要定義一個表,並且Rails在聲明一個模型成爲另一個模型的子類時會處理所有類型的列奧祕。

  2. 您試圖定義多個相似的表格,然後調整差異。這可以通過單個遷移中的循環和條件來完成。但是,您需要在任何繼承其他模型的模型中定義table_name以禁用隱含的單表繼承。遷移回路想是這樣的:

    class CreateLetter < ActiveRecord::Migration 
        def self.up 
        [:letters, :a, :b].each do |table_name| 
         create_table table_name do |t| 
         ... 
         t.timestamps 
    
         if table_name == :a 
          # columns only in table a 
         end 
    
         if table_name == :b 
          # columns only in table b 
         end   
         end 
        end 
    end 
    
1

當然可以......什麼這是你的目標是什麼?您將需要申報

class CreateA < CreateLetter

1

我在ActiveRecord的3.0.3

class BaseMigration < ActiveRecord::Migration 
    def self.create_base_columns(tbl) 
    tbl.string :some_reused_field 
    end 
end 

class AnotherMigration < BaseMigration 
    def self.up 
    create_table(:sometable) do |t| 
    create_base_columns(t) 
    end 
end 

與遷移這樣更新到3.2.3我不斷收到後「失蹤方法:create_table',所以我不得不改變:

module BaseMigration 
    def create_base_columns(tbl) 
    tbl.string :some_reused_field 
    end 
end 

class AnotherMigration < ActiveRecord::Migration 
    extend BaseMigration 
    def self.up 
    create_table(:sometable) do |t| 
     create_base_columns(t) 
    end 
    end 
end 

我會假設這些是等價的,但由於某種原因AR不再讓我使用繼承。

注:確實工作在3.0.3但只延長模塊兩種方法對3.2.3

工作時,我有時間,我想試試這一個準系統Rails應用程序。

相關問題