Jeremy EvanのSequelを使用して、(SQLite)データベースにWebページから取得したデータを入力しています。データベースには、私がアソシエーションで表現する多くの多対多の関係が含まれています。関連付けはクラス定義で作成され、スクリプトの実行時に常に評価されます。重要なのは、アソシエーションクラス定義に必要なテーブルを配置する必要があるということです。したがって、テーブル作成メソッドは、関連付け定義の最上位にある必要があります。次に例を示します。
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
私が必要だと思うのは、テーブルの関係を表現する別の方法です。
アプローチとスタイルに関する提案は大歓迎です。説明がわかりにくい場合は、説明を求めてください。