2013-04-13 3 views
2

내가 같은 코드가 있습니다레일 rabl 조건은 컨트롤러에서

@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 

내가 그것을 몇 가지 조건 CurrencyValue있어 각 ExchangerList에 대해 표시 할 필요를 , 아래에 나와있는대로 ...하지만 주요 문제는 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을 위해 내가 모든 currency_values ​​데이터와 노드를 작성,하지만 난이 부모를 bank_exchangers에 대한 노드에만 currency_values의 각 bank_exchangers에 대한 둘 필요가

{"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}}]}]} 

....

어떻게하면됩니까? 뭔가 명확하지 않은 경우

죄송합니다 ... 난

이 얼마나보기에 내 아이 @currencies 몇 가지 조건을 설정하는 ... 새로 온 사람? 당신이 조건이있는 경우

child :currency_values do 
    attribute :value 
end 

것은, 당신이 이러한 람다를 사용하여 포함 할 수 있습니다 :

당신은 ExchangerList와 CurrencyValues ​​사이의 관계를 이용

답변

0

걸릴 수 | 아이 => 람다 {경우 | 뭐라구? })

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

또한 단지 하나의 ExchangerList 개체 (예 : 쇼 뷰)를 정의 할 수 있습니다 :

collection @bank_exchangers, :root => "bank_exchangers", :object_root => false 
extends 'bank_exchangers/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 

을 또는 '통화'메소드를 ExchangerList 모델에 추가하면 RABL을 통해 메소드를 속성으로 직접 호출 할 수 있습니다.일부 테스트 코드는 내가 쓴 :

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

당신은 단순히 속성으로이를 호출 할 수

이 내가 당신이 달성하려고하는 형식과 유사하다 생각 다음 JSON, 결과
object @object 
attribute :test 

:

test: [ 
    { 
    qty: 1, 
    px: 2 
    }, 
    { 
    qty: 2, 
    px: 4 
    }, 
    { 
    qty: 3, 
    px: 6 
    } 
], 
+0

코드 번호는 어떻게됩니까? 조건을 하나만 더 추가 하시겠습니까? 람다가 여기 좋지 않기 때문에 ... –

+0

당신은 내가 방법 iterator를 가지고 참조하십시오. –

+0

루비 루프에서 이것을하는 방법? like each –