2016-12-21 27 views
1
def has_name? name 
    results = auths.map do |auth| 
       auth.role_groups.map do |role_group| 
        role_group.resources.any?{ |r| r.name == name} 
       end 
       end 
    results.any? 
    end 

這是用戶模型的方法
1用戶有很多auths中
1 AUTH有很多role_groups
1 role_group有很多資源
Rails:我可以使用兩個嵌套的地圖嗎?

我用了兩個地圖上有,但它並沒有返回結果我預計。這是我兩次嵌套地圖的第一次,我可以像這樣使用它嗎?

+0

你可以,但你期待什麼結果呢? – Ilya

+0

@llya我期望返回resource.name ==名稱的結果。然後通過results.any檢查結果數組是否爲空? –

+0

@MarcoSong:請添加您的預期結果。這將有助於更好地理解你的問題。 –

回答

2

你可以,但結果將有陣列數組,它不被認爲是空的。

[[]].any? 
=> true 

#flat_map可以幫助你在這裏

def has_name? name 
    results = auths.flat_map do |auth| 
    auth.role_groups.map do |role_group| 
     role_group.resources.any?{ |r| r.name == name} 
    end 
    end 

    results.any? 
end 

或者你可以完全改變你的解決方案,更好的性能,一個與SQL (沒有看到你的機型,不知道它會工作)

auths.joins(role_groups: :resources).where(resources: { name: name }).exists? 
+0

嘿,謝謝!我不知道爲什麼你的第一個解決方案仍然沒有回報我預期的價值,但你的第二個解決方案確實如此。這是我第一次看到人們在模型中使用sql查詢。神奇.. –

+0

你知道爲什麼第一個flat_map解決方案不起作用嗎?它應該返回true,因爲數組中有一個值,但它返回false –

+0

@MarcoSong很好,不是真的,應該可以正常工作。只需雙擊本地檢查。 'results'數組中有什麼值? –

0

首先,您可以添加authresources之間的直接關係。 在Auth模式: has_many: resources, through: role_groups

的已一對多,通過關係,也可以(在你的情況一樣)使用嵌套有一對多的關係。在這裏看看最後一個例子(文件,段,段關係):http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

然後,你可以做如下:

def has_name? name 
    auths.includes(:resources).flat_map(&:resources).any? do |resource| 
    resource.name == name 
    end 
end 
相關問題