用户有languages
,这是一组语言名称。我有这个方法:
def get_users_by_filtered_langauges(lang)
users = []
User.all.each do |u|
u.languages.each do |l|
users << u if lang.include?(l)
end
end
,其中lang
是一组语言名称,并返回languages
在lang
中包含某种语言的用户。例如,如果first_user
languages
["uk", "us"]
且lang
为["uk"]
,则该方法的返回值包括first_user
。< / p>
有没有办法最小化这个并以更简单的方式编写SQL查询?
答案 0 :(得分:0)
选择所有记录始终是反模式。人们应该只选择感兴趣的记录。如果您在编写查询时遇到问题,只选择感兴趣的记录,则应修改数据库结构。
以简单的方式编写SQL查询
这相对容易。对于单lang
来检查它将是:
%q|SELECT * FROM users WHERE languages LIKE "%#{lang}%"|
all
,您的方法也会滥用each
来减少输入。 在ruby中,它应该写成:
def get_users_by_filtered_langauges(*langs)
# single lang
# User.all.reject { |u| u.languages.include?(lang) }
# disjunction
User.all.reject { |u| (u.languages & langs).empty? }
end
答案 1 :(得分:0)
@ mudasobwa的回答是对的。但你也可以这样做。
User.where("languages like '%?%'", lang)