2012-08-01 17 views
3

我正在使用Jeremy Evan的Sequel來填充一個(SQLite)數據庫,其中包含我從網頁中抓取的數據。 數據庫涉及許多many_to_many關係,我用Associations表示。 這些關聯是在類定義中創建的,它們總是在腳本運行時進行評估。 重要的是,關聯類定義需要具備必要的表。 因此,表創建方法應該與關聯定義一起處於頂層。 下面是一個例子:用Ruby Sequel清理關聯定義

所有的
module Thing 
db = Sequel.Sqlite('data.sqlite') 

db.create_table(:clients) 
    String :client_id, :primary_key => true 
    String :client_data 
end 

db.create_table(:orders) 
    String :order_id, :primary_key => true 
    String :order_data 
end 

db.create_table(:orders_clients) 
    String :order_id 
    String :client_id 
    primary_key [:order_id,:client_id] 
end 

class Person < Sequel::Model 
    unrestrict_primary_key 
    many_to_many :orders 
end 

class Order < Sequel::Model 
    unrestrict_primary_key 
    many_to_many :orders 
end 
end 

首先,我認爲這是一個相當骯髒的解決方案,因爲我的方法調用和類定義坐在同一個命名空間。 如果我試圖分開類定義,我得到No database associated with Sequel::Model錯誤(這是有道理的,但我想延遲對關聯定義的評估,在表調用之後,只要它們可能發生)。

我希望能夠在方法調用中創建表和關聯。因此,我可以例如通過新的數據庫文件的名稱:

def create_tables_and_schema (database_name) 
    db = Sequel.Sqlite(database_name) 
    db.create_table... #three of those, as above 

class Person < Sequel::Model 
    unrestrict_primary_key 
    many_to_many :orders 
end 

class Order < Sequel::Model 
    unrestrict_primary_key 
    many_to_many :orders 
end 
end 

我認爲需要的是表達表關係的一種不同方式。

任何關於方法和風格的建議,我都讚賞。如果解釋混亂,請要求澄清。

回答

5

您的方法調用和類定義不需要坐在同一個名稱空間中,它只是需要在模型類之前創建表。將它們分開的簡單方法是將表格創建移動到單獨的文件。另外,通常你將數據庫對象分配給一個常量。

create_tables.rb:

DB.create_table(:clients) 
    String :client_id, :primary_key => true 
    String :client_data 
end 

DB.create_table(:orders) 
    String :order_id, :primary_key => true 
    String :order_data 
end 

DB.create_table(:orders_clients) 
    String :order_id 
    String :client_id 
    primary_key [:order_id,:client_id] 
end 

models.rb:

DB = Sequel.sqlite('data.sqlite') 
require 'create_tables' 

class Person < Sequel::Model 
    unrestrict_primary_key 
    many_to_many :orders 
end 

class Order < Sequel::Model 
    unrestrict_primary_key 
    many_to_many :orders 
end 

您提到要創建一個方法調用的表和關聯,但如果沒有任何意義你正在用常量創建類。通過方法調用創建它們的主要原因是允許在運行時使用多個數據庫,但這不適用於您的模型類,因爲它們是用常量名定義的。

如果您在運行時不需要多個數據庫,則上述示例應該可以工作,如果您只是想將表創建與模型創建分開。

如果您確實需要運行時的多個數據庫,那麼通過方法調用創建表和模型是有道理的,但您需要創建匿名模型類,否則您將遇到問題。

+2

這當然會使代碼更清潔。我想我將不得不應對我對常量的深刻恐懼。非常感謝,並感謝您的精彩項目。續集使Ruby成爲絕對不可抗拒的平臺。 – Manbroski 2012-08-01 16:46:10