模拟has_many:通过Mongoid

时间:2011-09-13 00:38:01

标签: ruby-on-rails activerecord mongodb mongoid data-modeling

我正在尝试使用MongoDB作为数据库创建一个事件平台。我想要EventsUsers之间的多对多关系。问题是,我希望关系中有属性(例如,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}}引用eGuest引用u

我知道u行不起作用。有关如何获得类似功能的任何建议?我想在e中使用has_many :through回调来添加对after_createGuest的引用,但这看起来很糟糕。

也许我走错了路。建议?感谢。

2 个答案:

答案 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