我正在尝试使用MongoDB作为数据库创建一个事件平台。我想要Events
和Users
之间的多对多关系。问题是,我希望关系中有属性(例如,Users
可以确认或未确认特定的Event
)。我意识到这将非常适合RDBMS,但我使用MongoDB的原因是我在其他地方占据优势,我宁愿继续使用它。
我希望每个Event
嵌入许多属于Guests
的{{1}}。这样,我可以看到哪些用户快速参加了一个事件并且只有一个查询。不过,我还想看看哪个Users
Events
正在快速参加,所以我希望每个User
都有User
个数组。
以下是代码摘要。
Event
使用理想的使用模式,# user of the application
class User
has_many :events
end
# event that users can choose to attend
class Event
embeds_many :guests
has_many :users, :through => :guests # Won't work
end
# guests for an event
class Guest
field :confirmed?, type: Boolean
embedded_in :event
belongs_to :user
end
# Ideal use pattern
u = User.create
e = Event.create
e.guests.create(:user => u, :confirmed => true)
的{{1}}引用e
,Guest
引用u
。
我知道u
行不起作用。有关如何获得类似功能的任何建议?我想在e
中使用has_many :through
回调来添加对after_create
中Guest
的引用,但这看起来很糟糕。
也许我走错了路。建议?感谢。
答案 0 :(得分:3)
您只需将事件ID存储在用户的数组中即可。
当事件发生变化或者由于某种原因从事件中删除用户时,您必须管理数组。但这就是权衡。
然后可以通过单个db调用找到User.events。
查看observers以管理关联。
答案 1 :(得分:3)
我最终在模型中使用回调来完成我想要的。这就是它的样子。
编辑:我刚刚看到了nodrog的回答。是的,使用观察者可能会更整洁,我不知道他们。谢谢!
# user of the application
class User
has_and_belongs_to_many :events, inverse_of: nil, dependent: :nullify
end
# event that users can choose to attend
class Event
embeds_many :guests
index 'guests.user_id', unique: true
before_destroy :cleanup_guest_references
def cleanup_guest_references
self.guests.each do |guest|
guest.destroy
end
end
end
# guests for an event
class Guest
field :confirmed?, type: Boolean
embedded_in :event, :inverse_of => :guests
belongs_to :user
after_create :add_event_for_user
before_destroy :remove_event_for_user
private
def add_event_for_user
self.user.events.push(self.event)
end
def remove_event_for_user
self.user.events.delete self.event
self.user.save
end
end