2013-07-08 88 views

回答

5

由於默認情況下,Rails使用YAML序列化數組,因此很難執行「包含值」查詢。

如果你的價值是獨一無二的,部分一組固定的,(如roles['User', 'Admin', 'Guest']),你可以做這樣的事情:

User.where("roles ilike '%\n- Guest\n%'") 

因爲這將匹配的---\n- User\n- Admin\n Guest\n的YAML。

或者,您可以在Postgres中使用本地數組類型。在Rails 3中,你將需要使用activerecord-postgres-array gem(儘管我不知道這是多麼好)。在Rails 4中,它是本地支持的。

您需要將您的列如:

t.string :roles_array, :array => true, :length => 30 

然後,你可以查詢反對:

User.where("'Guest' = ANY(roles_array)") 
+1

真棒!完美無缺,只是我尋找的東西,而這個小竅門肯定會在未來派上用場。謝謝! – ryan0

+0

我喜歡以前的方法,因爲它是DB不可知的,但後者更高性能? – ryan0

+0

由於您可以爲數組列添加索引,因此我會假設數組方法會更快;然而,你的數據集可能需要相當大才能注意到很大的不同。 –

相關問題