使用 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 >= 4pluck 接受多个参数,因此

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

站在巨人的肩膀上