如何在ruby中的sql查询中循环数组

时间:2017-11-27 06:21:05

标签: sql ruby-on-rails ruby activerecord

用户有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是一组语言名称,并返回languageslang中包含某种语言的用户。例如,如果first_user languages ["uk", "us"]lang["uk"],则该方法的返回值包括first_user。< / p>

有没有办法最小化这个并以更简单的方式编写SQL查询?

2 个答案:

答案 0 :(得分:0)

  1. 选择所有记录始终是反模式。人们应该只选择感兴趣的记录。如果您在编写查询时遇到问题,只选择感兴趣的记录,则应修改数据库结构。

  2.   

    以简单的方式编写SQL查询

  3. 这相对容易。对于单lang来检查它将是:

    %q|SELECT * FROM users WHERE languages LIKE "%#{lang}%"|
    
    1. 即使使用all,您的方法也会滥用each来减少输入。
    2. 在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)