1

这个问题与其他问题有关:Many-to-many Relations with Ruby, Redis, and Ohm

我有一个带有集合的模型,我想寻找一个 id。我怎样才能做到这一点?

楷模

class User < Ohm::Model
    attribute :name
end

class Event < Ohm::Model
    attribute :title
    collection :attendees, :User
end

用法

@fran = User.create(name: "Fran")
@event = Event.create(title: "Party in Las Vegas")
@event.attendees.add(@fran)

Event.find(attendees: @fran)
=> Ohm::IndexNotFound exception!

我想要的是能够由用户询问参加了哪些活动以及用户的活动是什么。

4

2 回答 2

1

您需要一组所有用户参加的活动,并且还需要一组所有用户参加的活动。最简单的方法是创建一个Attendee引用用户和事件的模型:

class Attendee < Ohm::Model
  reference :user, :User
  reference :event, :Event
end

u = User.create(name: "foo")
e = Event.create(name: "bar")

a = Attendee.create(user: u, event: e)

Attendee.find(user_id: u.id).include?(a)  #=> true
Attendee.find(event_id: e.id).include?(a) #=> true

然后,如果您想要所有参加活动的用户:

Attendee.find(event_id: e.id).map(&:user)

或用户参加的所有活动:

Attendee.find(user_id: e.id).map(&:event)

您可以在这些查找器中创建方法UserEvent作为它们的快捷方式:

class User < Ohm::Model
  attribute :name

  def events
    Attendee.find(user_id: id).map(&:event)
  end
end

class Event < Ohm::Model
  attribute :name

  def visitors
    Attendee.find(event_id: id).map(&:user)
  end
end

然后:

u.events.include?(e)   #=> true
e.visitors.include?(u) #=> true

让我知道它是否适用于您的用例。

于 2015-01-06T17:55:25.273 回答
1

我不熟悉欧姆,但我认为您只需要添加索引

class Event < Ohm::Model
  attribute :title
  collection :attendees, :User
  index :attendees
end

那么你应该能够做到

Event.find(attendees: @fran)

或者

Event.find(attendees: @fran.id)
于 2015-01-04T18:05:38.623 回答