2013-05-19 40 views
1

在我的Rails應用程序中,我有事件和用戶模型。業務規則規定一個事件擁有一個所有者和許多成員,並且所有者必須是成員。反過來,用戶會擁有許多「擁有的事件」和「事件」(他/她是其成員但不是所有者的事件)。我原本打算這個關聯模型像這樣:如何使用has_many:通過關聯建模所有者和成員?

class Event < ActiveRecord::Base 
    has_many :event_members, dependent: :destroy 

    has_one :owner, through: :event_members, source: :user, conditions: { owner: true } 
    has_many :members, through: :event_members, source: :user 
end 

class EventMember < ActiveRecord::Base 
    belongs_to :event 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :owned_events, through: :event_members, conditions: { owner: true } 
    has_many :events, through: :event_members 
end 

我認爲這將確保一個業主和業主將被列入會員協會免費。但是,這不起作用,因爲我無法通過集合指定has_one - event_members關聯。

有沒有更好的方法來建模?我可以在Event上添加一個臨時「所有者」屬性,該屬性通過所有者標誌查詢EventMember,但是這將用於設置所有者(即,我是否可以獲取已創建的EventMember記錄並確保所有者標誌已設置)?

回答

4

什麼的加盟模式EventMember添加owner屬性(也是在event_members表boolean類型的字段,用false默認值)。使用各自型號的方法訪問ownerowned_events

class Event < ActiveRecord::Base    
    has_many :event_members 
    has_many :members, :through => :event_members, :source => :user 

    def owner         
    event_members.ownerships.map(&:user).first                
    end           
end           

class EventMember < ActiveRecord::Base  
    belongs_to :event       
    belogns_to :user 

    scope :ownerships, -> { where(:owner => true) }       
end           

class User < ActiveRecord::Base    
    has_many :event_members      
    has_many :events, :through => :event_members 

    def owned_events       
    event_members.ownerships.map(&:event)  
    end           
end 

Event對象可能使用戶及其主人的責任。

class Event 
    def make_owner!(user) 
    membership = event_members.where(:user_id = user).first 
    membership.owner = true 
    membership.save 
    end 
end 

也許將邏輯在裏面取決於如何凌亂這會擋住你的應用程序的make_owner!只有一個所有者和抽象部分執行到EventMember

+0

它看起來像我要從事件模型手動強制所有權如何。我研究了這兩個解決方案:[Association Extensions](http://reefpoints.dockyard.com/ruby/2012/04/03/use-association-extensions-to-build-join-attributes-ona-a- hmt.html)和[Association Guist](https://gist.github.com/sj26/2310315) - 後者讓我非常接近我想要的,但是在訪問':through'屬性時我看到了奇怪的行爲。我認爲你的回答需要一個'after_create'鉤子,以防事件未被保存在'make_owner!'中 – ppilone

相關問題