Ruby Ohm,如何在一个集合或集合中找到记录?
问题描述:
此问题与其他:Many-to-many relationships with Ruby, Redis, and OhmRuby 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!
我想是能够通过其参加活动的用户要问,什么是由用户的活动。
答
您希望一组所有用户参加一个活动,并且您还希望一组用户参与的所有活动。最简单的方法是创建一个引用既是用户,又一个事件的模型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
让我知道它是否适合你的使用情况。
+0
因此...与欧姆我必须手工管理多对多的关系。我认为在ActiveRecord中有一些像has_and_belongs_to_many一样的东西。但无论如何这是有效的。 – 2015-01-07 16:29:34
答
我不熟悉欧姆,但我认为你只需要添加索引
class Event < Ohm::Model
attribute :title
collection :attendees, :User
index :attendees
end
那么你应该能够做到
Event.find(attendees: @fran)
OR
Event.find(attendees: @fran.id)
你好弗兰,明天我会回复,对不起,延迟! – soveran 2015-01-04 22:47:26