Rails存储AR结果的值

时间:2012-10-26 15:50:04

标签: ruby-on-rails activerecord sagepay

我在控制器中存储查询结果时遇到问题:

payments = Payment.select("SecurityKey").where("VendorTxCode = '%#{params[:VendorTxCode]}%'").limit(1)

payments.each do |payment|
    security_key = payment.SecurityKey
end

稍后当我使用security_key时,我收到一个未定义的错误。但是,当我在rails console中执行此操作时:

payments.each do |payment|
    puts payment.SecurityKey
end
#=> df4g5ds6

如何将此结果存储在变量中以供日后使用?

4 个答案:

答案 0 :(得分:1)

看起来你需要在每个do块之前定义你的变量。尝试将密钥存储到数组中:

payments = Payment.select("SecurityKey").where("VendorTxCode = '%#
{params[:VendorTxCode]}%'").limit(1)

security_key = []
payments.each do |payment|
    security_key << payment.SecurityKey
end

然后你可以访问像security_key [0]等

这样的键

答案 1 :(得分:0)

首先,由于您将搜索限制为1,因此您不需要使用循环。只是做:

security_key = payments.first.SecurityKey

除此之外,你的意思是“当我使用security_key之后,我得到一个未定义的错误。”你在哪里用它?你在那种方法中使用它吗?那应该在那里。唯一的原因可能是,如果您的查询没有返回任何内容。如果您的查询返回一个空集合,那么循环将永远不会发生,并且永远不会创建或设置该变量。

试试这个:

payments = Payment.select("SecurityKey").where("VendorTxCode = '%#{params[:VendorTxCode]}%'").limit(1)

p payments.first # Will output nil if it's not there

如果输出nil,那么你就知道发生了什么。然后,您必须修改代码以检查nil并相应地响应/行为。

答案 2 :(得分:0)

如果“稍后”表示从帮助者或视图访问它,则需要将变量设为实例变量而不是本地变量:@security_key

答案 3 :(得分:0)

您将security_key定义为您传递给每个语句的do...end块范围内的局部变量。换句话说,它不在该块之外。 这是Pry控制台中的一个例子。

[4] pry(main)> (1..10).each {|number| result = number}
=> 1..10
[5] pry(main)> result
NameError: undefined local variable or method `result' for main:Object

块内定义的结果未定义或在其外部可见。

[6] pry(main)> result = 0
=> 0
[7] pry(main)> (1..10).each {|number| result = number}
=> 1..10
[8] pry(main)> result
=> 10

在这里,通过首先在控制台会话范围内定义结果,我现在可以看到块内的更改。

这有意义吗?