我正在使用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
我認爲需要的是表達表關係的一種不同方式。
任何關於方法和風格的建議,我都讚賞。如果解釋混亂,請要求澄清。
這當然會使代碼更清潔。我想我將不得不應對我對常量的深刻恐懼。非常感謝,並感謝您的精彩項目。續集使Ruby成爲絕對不可抗拒的平臺。 – Manbroski 2012-08-01 16:46:10