2013-04-13 1 views
2

В контроллере у меня есть такой код:Rails Рабль условие для класса переменной с учетом

@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 с некоторыми условиями , как я изложил ниже ... Но главная проблема заключается в том, что уровень шума составляет:

У меня есть такой код:

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 я создаю узел с его валютами ... Но мне нужно отображать узел только для этого итератора @bank_exchangers, если бы я писал в контроллере, я бы написал что-то вроде:

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

Как установить что-то подобное на виду?

Becouse теперь мой выход, как:

{"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 ​​для этого bank_exchangers родителя ....

Как я мог это сделать?

Извините, если что-то не понятно ... я новый ...

Просто, как установить для моего ребенка @currencies ввиду некоторых условий?

ответ

0

Вы можете воспользоваться соотношением между ExchangerList и CurrencyValues:

child :currency_values do 
    attribute :value 
end 

Если у вас есть условия, вы можете включить их с помощью лямбда: если => лямбда {| ребенка | child.something? })

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

Вы также можете определить вид для просто один объект ExchangerList (т.е. шоу):

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' 

В качестве альтернативы, если вы добавите метод «валют» к модели 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 
    } 
], 
+0

кромка, но как с моим кодом? просто добавьте еще одно условие? потому что lambdas здесь не очень хороши ... –

+0

как вы видите, у меня есть итератор в методе –

+0

как это сделать в рубиновых петлях? как каждый –

Смежные вопросы