Ruby 哎呀,如何在集合或集合中查找记录?

Ruby Ohm, how to find a record in a set or collection?

此问题与其他问题相关:Many-to-many relationships 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!

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

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

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

那你应该可以做到

Event.find(attendees: @fran)

Event.find(attendees: @fran.id)

您想要一组所有参加活动的用户,还想要一组所有用户参加的活动。最简单的方法是创建一个同时引用用户和事件的模型 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

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