2

コントローラーには、次のようなコードがあります。

    @bank_exchangers = ExchangerList.find(:all, :conditions => {:bank_id => params[:id]})
    @currency_list = CurrencyList.all
    @currencies = []
    @currency_list.each do |c|
      @currencies << CurrencyValue.find(:all, :conditions => {:currency_list_id => c.id}, :order => :updated_at)
    end
    @currencies.flatten!

そして私はそのようなモデルを持っています:

class CurrencyList < ActiveRecord::Base
  attr_accessible :code, :country, :name
  has_many :currency_values
end


class CurrencyValue < ActiveRecord::Base
  attr_accessible :currency_list_id, :direction_of_exchange_id, :value
  belongs_to :currency_list
  belongs_to :exchanger_list
end


class ExchangerList < ActiveRecord::Base
  attr_accessible :address, :bank_id, :exchanger_type_id, :latitude, :location_id, :longitude, :name
  has_many :currency_values
end

以下に示すように、ExchangerListごとにいくつかの条件でCurrencyValueを表示する必要があります...しかし、主な問題はrabl出力にあります:

私はそのようなコードを持っています:

collection @bank_exchangers, :root => "bank_exchangers", :object_root => false
attributes :id, :name, :address, :location_id, :latitude, :longitude, :exchanger_type_id
child @currencies do 
  attribute :value 
end

ご覧のとおり、ここでは @bank_exchangers ごとに @currencies を使用してノードを作成します...ただし、この @bank_exchangers イテレータに対してのみノードを表示する必要があります。コントローラーに書き込む場合は、次のように記述します。

@currencies << CurrencyValue.find(:all, :conditions => {:currency_list_id => c.id, :exchanger_list_id => param}, :order => :updated_at)

このようなものをビューに設定するにはどうすればよいですか?

今、私の出力は次のようになっているためです:

{"bank_exchangers":[{"id":3,"name":"Банк *** ЦБУ №1","address":"г. Минск, ул. Московская, 13","location_id":8,"latitude":null,"longitude":null,"exchanger_type_id":1,"location_name":"Минск","exchanger_type_name":"normal","currency_values":[{"currency_value":{"value":8620.0}},{"currency_value":{"value":8620.0}},{"currency_value":{"value":8700.0}},{"currency_value":{"value":8700.0}},{"currency_value":{"value":8620.0}},{"currency_value":{"value":8700.0}},{"currency_value":{"value":11500.0}},{"currency_value":{"value":11100.0}}]},{"id":4,"name":"Банк ***","address":"г. Минск, Мясникова, 32","location_id":8,"latitude":null,"longitude":null,"exchanger_type_id":1,"location_name":"Минск","exchanger_type_name":"normal","currency_values":[{"currency_value":{"value":8620.0}},{"currency_value":{"value":8620.0}},{"currency_value":{"value":8700.0}},{"currency_value":{"value":8700.0}},{"currency_value":{"value":8620.0}},{"currency_value":{"value":8700.0}},{"currency_value":{"value":11500.0}},{"currency_value":{"value":11100.0}}]}]}

ご覧のとおり、bank_exchangers ごとにすべて currency_values データを持つノードを作成しますが、この bank_exchangers 親の currency_values のみをノードに配置する必要があります....

どうすればこれを行うことができますか?

何かが明確でない場合は申し訳ありません...私は新しいです...

ビューのある条件で私の子供の @currencies を設定するにはどうすればよいですか?

4

1 に答える 1

0

ExchangerList と CurrencyValues の関係を利用できます。

child :currency_values do
  attribute :value
end

条件がある場合は、ラムダを使用してこれらを含めることができます。チャイルド何か?}))

child(:currency_values, if => lambda { |currency_value| currency_value.something? }) do
  attribute :value
end

1 つの ExchangerList オブジェクト (つまり、show) のビューを定義することもできます。

object @bank_exchanger, :object_root => false
attributes :id, :name, :address, :location_id, :latitude, :longitude, :exchanger_type_id

child(:currency_values, if => lambda { |currency_value| currency_value.something? }) do
  attribute :value
end

次に、コレクションにこれを拡張させるだけです:

collection @bank_exchangers, :root => "bank_exchangers", :object_root => false
extends 'bank_exchangers/show'

または、'currencies' メソッドを ExchangerList モデルに追加すると、RABL を介して属性としてメソッドを直接呼び出すことができます。私が書いたいくつかのテストコード:

def test
  test_array = []
  1.upto(3) do |i|
    test_array << {qty: i, px: 2*i}
  end
  return test_array
end

これを属性として簡単に呼び出すことができます。

object @object
attribute :test

これにより、次の JSON が生成されます。これは、達成しようとしている形式に似ていると思います。

test: [
  {
    qty: 1,
    px: 2
  },
  {
    qty: 2,
    px: 4
  },
  {
    qty: 3,
    px: 6
  }
],
于 2013-04-13T21:43:32.507 に答える