同一模型之间的多对多和一对多关联

时间:2014-07-27 22:40:09

标签: ruby orm sequel-gem

我正在创建一个简单的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. 我使用关联的当前方式是否有意义?
  2. 如何根据续集的关联模型表达事件的所有权?

1 个答案:

答案 0 :(得分: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)