使用 Rails 3 从数据库中获取数据数组
Fetching array of data from DB using Rails 3
我想使用 Rails 3.But 访问多个列,它给了我以下错误。
Error:
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.Please访问行值帮助我解决这个错误。
你的 pluck(:type ,:Receipt_No)
看起来不对,
pluck 只有一个参数。
另外你的数据类型 @vendor_type
是错误的,Array 没有 key, value
对。
这样使用map
,
@vendor_type=PaymentVendor.where(:v_name => params[:v_name]).map { |i| [i.Receipt_No] }
感谢 ActiveRecord >= 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/
就制作 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
站在巨人的肩膀上
我想使用 Rails 3.But 访问多个列,它给了我以下错误。
Error:
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.Please访问行值帮助我解决这个错误。
你的 pluck(:type ,:Receipt_No)
看起来不对,
pluck 只有一个参数。
另外你的数据类型 @vendor_type
是错误的,Array 没有 key, value
对。
这样使用map
,
@vendor_type=PaymentVendor.where(:v_name => params[:v_name]).map { |i| [i.Receipt_No] }
感谢 ActiveRecord >= 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/
就制作 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
站在巨人的肩膀上