我正在開發一個應用程序,用戶參與一個或多個事件,因此可以說基於他們在這些事件中佔據的角色「有」事件。我正在使用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
我的擔憂是
- 這種方法在某種程度上違反了單一責任原則。
- 此方法需要多個數據庫調用才能最終獲取事件 - 一個是角色,另一個是事件。 (我對這種事情沒有經驗,所以我不確定它真的有多糟糕。)
有沒有更好的方式來獲取用戶的事件,同時保持我的Rolify角色設置?
這是拋出一個語法錯誤,上面寫着:「引發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「 –
是的,那是一個錯字。關鍵應該是「來源」 - 我已經更新了我的回覆。 – Humza
這個效果很好。 –