此问题与其他问题有关: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!
我想要的是能够出席参加活动的用户以及用户的活动。
答案 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)
您可以在User
和Event
中创建方法,作为这些查找程序的快捷方式:
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)