2014-12-27 18 views
0

我正在開發一個應用程序,用戶參與一個或多個事件,因此可以說基於他們在這些事件中佔據的角色「有」事件。我正在使用Rolify將用戶與事件相關聯。 Rolify根據用戶在該事件中佔據的角色形成用戶和事件之間的關聯。 Rolify更關心的是返回有關用戶角色的數據,但不關心用戶具有角色的事件,因此不會返回有關該事件的數據(除了ID)。Ruby/Rails - 對我的用戶模型是一個「事件」方法,這是一個壞主意?

所以,我可以寫這樣的方法:

@user.roles 

,並獲得與用戶相關聯的所有角色。

一個這樣的角色看起來是這樣的:

=> #<Role id: 1, name: "admin", resource_id: 1, resource_type: "Event", created_at: "2014-12-19 04:00:33", updated_at: "2014-12-19 04:00:33"> 

我希望能夠做的就是

@user.events(roleName) 

,並獲得與角色名相關聯的所有事件。

很顯然,我不能只做什麼是通過Rolify提供給我,所以我創建了我的用戶模型的方法,以幫助這個給定:

def events roleName=nil 
    events_list = [] 

    self.roles.each do |role| 
     unless roleName.nil? 
     if role.name == roleName && role.resource_type == "Event" 
      events_list.push(role.resource_id) 
     end 
     else 
     events_list.push(role.resource_id) 
     end 
    end 
    Event.find(events_list) 
    end 

我的擔憂是

  1. 這種方法在某種程度上違反了單一責任原則。
  2. 此方法需要多個數據庫調用才能最終獲取事件 - 一個是角色,另一個是事件。 (我對這種事情沒有經驗,所以我不確定它真的有多糟糕。)

有沒有更好的方式來獲取用戶的事件,同時保持我的Rolify角色設置?

回答

1

是啊,這是一個壞主意,當你有Rails中的下列可能性:

在您的用戶模型補充一點:

has_many :events, through: :roles, source: :resource, source_type: 'Event' 

這樣user.events將返回用戶的所有事件。而對於特定角色的事件,你可以:

user.events.where(roles: {name: role_name}) 

Lastly, a suggestion: don't use camel-case names for methods, variables, or symbols.

+0

這是拋出一個語法錯誤,上面寫着:「引發ArgumentError:未知鍵::會員合法的鍵:CLASS_NAME,:類: foreign_key :: validate :: autosave :: table_name :: before_add :: after_add :: before_remove :: after_remove :: extend :: primary_key :: dependent :: as :: through :: source :: source_type :: inverse_of :: counter_cache, :join_table「 –

+1

是的,那是一個錯字。關鍵應該是「來源」 - 我已經更新了我的回覆。 – Humza

+0

這個效果很好。 –

相關問題