我想使用Rails 3访问多个列。但是它给了我以下错误。
错误:
ArgumentError (wrong number of arguments (2 for 1)):
app/controllers/payments_controller.rb:13:in `check_type'
检查我的以下代码。
payment_controller.rb:
class PaymentsController < ApplicationController
def payment
@payment=Vendor.new
respond_to do |format|
format.html
format.js
end
end
def check_type
if params[:commit]=="submit"
@vendor_type=PaymentVendor.where(:v_name => params[:v_name]).pluck(:type ,:Receipt_No)
@vendor_type.each do |vendor|
end
else
@v_name=Vendor.where(:s_catagory => params[:payment][:s_catagory] ).pluck(:v_name)
end
end
end
实际上我想要检索以下格式的数据。
@vendor_type=["Receipt_no":"type","Receipt_no":"type",.....]
一旦显示这些数据,我需要如何根据Receipt_No访问行值。请帮我解决此错误。
答案 0 :(得分:3)
感谢 ActiveRecord&gt; = 4 。 pluck
接受多个参数,所以在
Rails 4:您的查询将有效
@vendor_type=PaymentVendor.where(:v_name => params[:v_name]).pluck(:type ,:Receipt_No)
现在,当您使用 Rails 3 时,它不支持pluck
的多个参数,那么我们可以像这样扩展ActiveRecord::Relation
:
将您的文件放在 config / initializers
下# pluck_all.rb
module ActiveRecord
class Relation
def pluck_all(*args)
args.map! do |column_name|
if column_name.is_a?(Symbol) && column_names.include?(column_name.to_s)
"#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}"
else
column_name.to_s
end
end
relation = clone
relation.select_values = args
klass.connection.select_all(relation.arel).map! do |attributes|
initialized_attributes = klass.initialize_attributes(attributes)
attributes.each do |key, attribute|
attributes[key] = klass.type_cast_attribute(key, initialized_attributes)
end
end
end
end
end
现在在您的控制器中,您可以将多个参数传递给pluck
,如下所示:
# payment_controller.rb:
@vendor_type=PaymentVendor.where(:v_name => params[:v_name]).pluck_all(:type ,:Receipt_No)
现在,您可以在整个应用中使用pluck_all
。希望这会有所帮助;)
修改强>
如果plcuk_all
无效,请尝试以下代码:
@vendor_type = PaymentVendor.where(:v_name => params[:v_name]).map{|v|[v.type ,v.Receipt_No]}
参考更多信息:http://meltingice.net/2013/06/11/pluck-multiple-columns-rails/
答案 1 :(得分:1)
您的pluck(:type ,:Receipt_No)
看起来不对,
采摘只有一个论点。
此外,您的数据类型@vendor_type
错误,数组没有key, value
对。
像这样使用map
,
@vendor_type=PaymentVendor.where(:v_name => params[:v_name]).map { |i| [i.Receipt_No] }
答案 2 :(得分:0)
在制作rails 3方法方面,其行为与Rails 4采用多列相同。这会输出一个类似的数组(而不是散列键值集合)。如果你来升级并想要清理代码,这应该可以节省一些痛苦。
请参阅此tutorial,其中概述了输出哈希的类似方法。
config/initializers/pluck_all.rb
module ActiveRecord
class Relation
def pluck_all(*args)
args.map! do |column_name|
if column_name.is_a?(Symbol) && column_names.include?(column_name.to_s)
"#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}"
else
column_name.to_s
end
end
relation = clone
relation.select_values = args
klass.connection.select_all(relation.arel).map! do |attributes|
initialized_attributes = klass.initialize_attributes(attributes)
attributes.map do |key, attribute|
klass.type_cast_attribute(key, initialized_attributes)
end
end
end
end
end
站在巨人和所有人的肩膀上