2016-07-28 106 views
0

我遇到了一個問題,與軌道cancancan管理關係的Rails

gem 'cancancan', '~> 1.10' 

的cancancan寶石,我有四個型號:用戶,公司,地點,團體

用戶:屬於公司 公司:有許多地方 地點:屬於公司 組:屬於位置

在能力模型,我有這樣的:

can :manage, Group, :location => {:id => user.company.locations.map{|l| l.id}} 

當創建我否認新組(用不上)

我正在尋找正確的方式允許用戶創建一組與公司所在地的id(注一:無cancancan在這一切作品和所有ID是相關的等)。

回答

1

爲了確保我理解你的問題完全...

你正在尋找一種方式來限制用戶的管理基礎上的公司,用戶所屬的位置組的能力?

假設我有一個正確的,我會建議使用#pluck

can :manage, Group, location_id: user.company.locations.pluck(:id) 

此收集關於用戶的公司的位置所有:id的,並確保用戶只能管理有一個團體:該集合中包含的location_id。

功能,這等同於你做了什麼,但在兩個方面更爲有效:

  1. 它不涉及任何不必要的Ruby邏輯

  2. 使用#pluck只查詢上的某個位置:id,而不是整個位置其所有屬性

一般而言,無論何時在Rails中訪問數據庫時,最好完全使用ActiveRecord方法。這將有助於防止浪費時間查詢不需要的額外信息,並消除使用Ruby重新構建數據的額外開銷。

希望有幫助!

+0

謝謝!你的使用採摘的建議正是我一直在尋找的!但是我仍然無法創建一個組。嘗試創建時,它會向我顯示我無權訪問該資源。 – gregwinn

+0

嗯......只是爲了仔細檢查,您正嘗試爲屬於您的用戶帳戶所屬的公司的位置創建一個組,對嗎? 因爲如果cancancan設置正確,那麼只有在公司的位置集合中存在location_id時才能創建組。如果您嘗試創建的羣組沒有必要的location_id,它*應該*拒絕您。 – H12

+0

正確,我在下面包含更多細節: def group_params params。要求(:組).permit(:姓名,:LOCATION_ID) 端 創建方法: @ group.create(group_params).save PARAMS在dev的日誌發送: ' 「基團」=> { 「name」=>「Test」},「button」=>「」,「location_id」=>「1」}' – gregwinn