Ruby 查询activerecord模型以获得普通数组(迭代、映射等等……需要学习一些东西)

Ruby 查询activerecord模型以获得普通数组(迭代、映射等等……需要学习一些东西),ruby,Ruby,因此,我需要从a模型的关联中获取一些值: def provide_list(x,y) self.send(x.to_sym).map {|k,v| k[y] } end 好的。在这个模型中,我可以举一个例子 instance.provide_list('resources', 'thefieldiwant') 更具体地说,我将获得关联资源的一个值数组,例如 accountinstance.provide_list('users', 'numberlogins') acco

因此,我需要从a模型的关联中获取一些值:

  def provide_list(x,y)
    self.send(x.to_sym).map {|k,v| k[y] }
  end
好的。在这个模型中,我可以举一个例子

instance.provide_list('resources', 'thefieldiwant')
更具体地说,我将获得关联资源的一个值数组,例如

 accountinstance.provide_list('users', 'numberlogins')
 accountinstance.provide_list('users', 'loginproblems')
然后得到如下数组

 [45,56,78,1,2,etc]
 [5,5,7,1,2,etc]
然后将它们压缩在一起,为我可以传递的每个用户获取元组数组([45,5],[56,6],…),等等

我想改进这一点,因此当我想要关联的特定字段数组时,不必每次都手动运行(并且作为一个方法的前奏,该方法可以通过对每个关联实例的一次调用来获取和压缩所需的内容):

这不起作用,我只是得到了一个arg数组,所以我不知道的是,这是绊倒了。基本问题:除了为每个参数提供一个数组外,如何使第二个参数的行为与第一个参数的行为一致

如果以前有人问过我,我会接受关于更好的方法的建议,我做错了什么,等等。这似乎是一件基本的事情,我现在不能做对,所以我会先问一下,然后再把它放在一边,这样有更专业的人可以启发我

解决方案是让我学习更精细的操作ActiveRecord的方法,我几乎不是专家,回顾一下这一点有助于:


有点老套,但应该可以:

def provide_list association, *args
  association = self.send(association.to_sym)
  association.connection.select_all("select #{args.join(',')} from #{association.table_name}'").map(&:values)
end

哈克,但应该有效:

def provide_list association, *args
  association = self.send(association.to_sym)
  association.connection.select_all("select #{args.join(',')} from #{association.table_name}'").map(&:values)
end

您可以在控制台中尝试以下操作:

self.send(dd.to_sym)
返回哈希数组。例如:

@arr = [{a:1, b:2, c:3}, {a:4, b:5, c:6}]
您可能希望返回如下所示的二维数组:

def provide_listing( *args )
  args.map do |arg|
    @arr.map do |h|
      h[arg]
    end
  end
end
提供清单(:a,:b,:c)


=>[[1,4],[2,5],[3,6]

您可以在控制台中尝试以下操作:

self.send(dd.to_sym)
返回哈希数组。例如:

@arr = [{a:1, b:2, c:3}, {a:4, b:5, c:6}]
您可能希望返回如下所示的二维数组:

def provide_listing( *args )
  args.map do |arg|
    @arr.map do |h|
      h[arg]
    end
  end
end
提供清单(:a,:b,:c)


=>[[1,4],[2,5],[3,6]

第二种方法的主要问题是返回#each的值,在本例中,该值始终只是调用的对象#,在args中

我喜欢佩德罗的解决方案,但我会稍微调整一下:

def provide_list(association, *args)
  self.send(association).select(args).map { |r| r.attributes.values }
end
需要注意的几件事:

  • 您不需要使用。要使用符号,发送和选择将使用字符串或符号
  • 我会避免使用原始sql,当然它会更快,但更容易出错、移植性问题和sql注入——除非有很好的理由,否则永远不要编写原始sql

希望有帮助

第二种方法的主要问题是返回#each的值,该值始终只是调用的对象#each,在本例中为args

我喜欢佩德罗的解决方案,但我会稍微调整一下:

def provide_list(association, *args)
  self.send(association).select(args).map { |r| r.attributes.values }
end
需要注意的几件事:

  • 您不需要使用。要使用符号,发送和选择将使用字符串或符号
  • 我会避免使用原始sql,当然它会更快,但更容易出错、移植性问题和sql注入——除非有很好的理由,否则永远不要编写原始sql

希望有帮助

在发布我的问题后,我做了一些类似的事情,但反过来了。这是有效的。在发布我的问题后,我做了类似的事情,但却反过来了。这是可行的。我现在使用符号发送…最初我收到了错误,但指定:myassociation作为参数在没有to_sym的情况下工作。这更多是我的想法,但最初不知道。我现在使用符号发送…最初我收到了错误,但指定:myassociation作为参数在没有to_sym的情况下工作。这更多是什么我本来是在垂钓,但不知道。