使用Rails 3从DB获取数据数组

时间:2015-04-27 13:00:30

标签: ruby ruby-on-rails-3.2

我想使用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访问行值。请帮我解决此错误。

3 个答案:

答案 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

站在巨人和所有人的肩膀上