2017-01-12 42 views
0

我有一個方法:導軌 - 返回了誰的方法返回true的所有記錄

class Role 
    def currently_active 
    klass = roleable_type.constantize 
    actor = Person.find(role_actor_id) 
    parent = klass.find(roleable_id) 
    return true if parent.current_membership? 
    actor.current_membership? 
    end 
end 

我想返回誰這種方法是真正作用的所有實例,但無法通過他們迭代所有這些都需要大約20秒。我試圖使用,語句,但是它們所依賴的模型的屬性,而不是一個方法:

Role.where(currently_active: true) 

,因爲沒有所謂的currently_active屬性,這顯然會引發錯誤。我怎樣才能以最有效的方式執行這個查詢,並且如果可能的話使用Active Records而不是數組?

在此先感謝

+0

這取決於你'complicated_block' –

+0

使用ActiveRecord的,你應該對數據庫列進行操作。顯示你的'complex_block' –

+0

我已經添加了塊...有什麼方法可以使用Active Record關係,而不是數據庫列....? – Mark

回答

1

這似乎是不可能的,你的情況,你所要做的迭代。我認爲最好的解決方案是在表格中添加一個Boolean列,以便您可以通過查詢進行過濾,這將更快。

在編輯後看到你的方法後,由於循環似乎不是很慢,因爲它很慢,因爲Person.findklass.find,你正在做很多查詢和數據庫讀取。 (你最好使用關聯和做一些急切的加載,它會快得多)

另一個解決方法是你可以使用ActiveModelSerializers,在序列化器中你可以根據條件獲取對象的屬性。之後你可以運用你的邏輯忽略具有某種標誌或屬性的對象。

See here the documentation of active model serializer

Conditional attributes in Active Model Serializers

+0

我從來沒有在JSON之外使用過它們 - 會看一看 - 謝謝你的答案。 – Mark