Я использую Sequel Джереми Эвана для заполнения базы данных (SQLite) данными, которые я собираю с веб-страниц. База данных включает ряд отношений «многие ко многим», которые я выражаю с помощью ассоциаций. Связи создаются в определениях классов, которые всегда оцениваются при запуске скрипта. Важно отметить, что определения класса ассоциации должны иметь необходимые таблицы. Таким образом, методы создания таблиц должны находиться на верхнем уровне с определениями ассоциации. Вот пример:
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
Я думаю, что необходим другой способ выражения табличных отношений.
Приветствуются любые предложения по подходу и стилю. Пожалуйста, попросите разъяснений, если объяснение сбивает с толку.