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

时间:2015-01-04 11:46:27

标签: ruby ohm

此问题与其他问题有关: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!

我想要的是能够出席参加活动的用户以及用户的活动。

2 个答案:

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

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

答案 1 :(得分:0)

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

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

然后你应该能够做到

Event.find(attendees: @fran)

OR

Event.find(attendees: @fran.id)