Много ко многим и один ко многим, связь между одними и теми же моделями
Я создаю простое приложение Sinatra, используя Sequel для своего ORM. Большая часть данных вращается вокруг пользователей и событий, где:
- Событие может иметь много пользователей, один из которых является "владельцем".
- У пользователей может быть много событий, одно или много из которых они "владеют".
Вот упрощенная версия моих определений схемы / модели:
class User < Sequel::Model(:users)
many_to_many :events
one_to_one :event
end
class Event < Sequel::Model(:events)
many_to_many :users
many_to_one :user
end
# provides a link between users and events
# e.g. event.users or user.events
# I am unsure how necessary this is :)
db.create_table :events_users do
primay_key :id
foreign_key :event_id, :events
foreign_key :user_id, :users
end
Это позволяет мне привязать пользователей к событию или к событиям, к которым присоединен пользователь, но я изо всех сил пытаюсь выразить "право собственности" на событие. Кажется, что следующий псевдокод будет работать:
my_user = User.all.first
owned_events = Event.where(user_id = my_user.user_id)
Это приводит к двум вопросам:
- Имеет ли смысл то, как я сейчас использую ассоциации?
- Как я могу выразить право собственности на событие с точки зрения модели ассоциации сиквела?
1 ответ
Решение
Может быть, что-то вроде этого:
class Event
many_to_one :owner, :class=>:User
many_to_many :users
end
class User
one_to_many :owned_events, :class=>:Event, :key=>:owner_id
many_to_many :events
end
Вам нужно будет добавить owned_id
поле в events
Таблица.
Использование:
user = User.all.first
event = Event.new(:title => 'New Event')
events.add_owner(user)
event.save
another_user = User.create(:name => 'Jack')
event.add_user(another_user)