2015-01-04 60 views
0

此問題與其他: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! 

我想是能夠通過其參加活動的用戶要問,什麼是由用戶的活動。

+0

你好弗蘭,明天我會回覆,對不起,延遲! – soveran 2015-01-04 22:47:26

回答

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 

讓我知道它是否適合你的使用情況。

+0

因此...與歐姆我必須手工管理多對多的關係。我認爲在ActiveRecord中有一些像has_and_belongs_to_many一樣的東西。但無論如何這是有效的。 – 2015-01-07 16:29:34

0

我不熟悉歐姆,但我認爲你只需要添加索引

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

那麼你應該能夠做到

Event.find(attendees: @fran) 

OR

Event.find(attendees: @fran.id) 
相關問題