【问题标题】:How do I create array of data from Users table in Rails Active Record?如何从 Rails Active Record 中的用户表创建数据数组?
【发布时间】:2020-10-04 01:25:53
【问题描述】:

我有一个包含 full_name, email, phone, address, city, state, zip 列的用户表

我需要从包含此格式的全名和电子邮件的用户表中创建一个数组 ["user1.full_name, user1.email", "user2.full_name, user2.email" 等]

我在编写此查询时遇到问题。

这是我目前所拥有的

#create empty arrays
full_names = []
emails = []
#populate the full_names array
user_full_name = User.all
user_full_name.each{|x| full_names<<x.full_name}
#populate the emails array
user_email = User.all
user_email.each{|x| emails<<x.email}

#combine the two arrays
full_names.zip(emails)

但这给了我一个多维数组 [["full_name, email"], ["full_name, email"] 等]

我如何得到它的格式 [“全名,电子邮件”,“全名,电子邮件”等]

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    这里有两个*可能的解决方案及其对应的SQL:

    # SELECT "users"."full_name", "users"."email" FROM "users"
    User.pluck('full_name', 'email').map{ |u| u.join(', ')}.flatten
    
    # SELECT "users".* FROM "users"
    User.all.map { |u| "#{u.full_name}, #{u.email}" }
    

    所以pluckall.map 更高效,因为它只选择你想要的属性。

    *这两个都在之前的回答中提到过。

    【讨论】:

      【解决方案2】:
      User.all.map do |user|
        "#{user.full_name}, #{user.email}"
      end
      

      Array#map


      提供更多关于此的信息。当您使用 ActiveRecord::QueryMethod(例如,您通过 ActiveRecord 进行查询)时,结果实际上不是一个数组,但是它表现类似于一个数组,并且通过在其上调用一个数组方法,您可以获取结果(见ActiveRecord::Relation)。说了一大堆,但希望下面的例子会更清楚:

      # This builds a query but doesn't actually fire it!
      users = User.all
      
      # chain onto the query - it still won't be fired yet
      users = users.where.not(name: "Rick")
      
      # see the query that will be run
      users.to_sql
      
      # check the type of this variable
      users.class
      # => ActiveRecord::Relation
      
      # evaluates the query
      users.count
      
      # evaluates the query
      users.to_a
      
      # evaluates the query
      users.any? { |user| user.email.nil? }
      
      # evaluates the query
      users.map { |user| user.full_name }
      
      # evaluates the query
      # does the same thing as the previous line
      users.pluck(:first_name)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 2023-03-04
        • 2023-03-15
        • 2013-06-27
        • 1970-01-01
        • 2015-07-03
        相关资源
        最近更新 更多