Условие Rails 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

мне нужно отобразить для каждого 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}}]}]}

как вы можете видеть, для каждого банка_обменников я создаю узел со всеми данными currency_values, но мне нужно поместить для каждого банка_обменников в узел только валютные_значения для этого родительского банка_обменников....

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

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

Только как установить для моего ребенка @currencies в представлении какое-то условие?


person Valdis Azamaris    schedule 13.04.2013    source источник


Ответы (1)


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

child :currency_values do
  attribute :value
end

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

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
  }
],
person mikeryz    schedule 13.04.2013
comment
кхм, а как с моим кодом? просто добавить еще одно условие? потому что лямбды здесь не годятся... - person Valdis Azamaris; 14.04.2013
comment
как видите, у меня есть итератор в методе - person Valdis Azamaris; 14.04.2013
comment
как это сделать в рубиновых петлях? как каждый - person Valdis Azamaris; 14.04.2013
comment
Если вы можете написать итератор как метод модели ExchangeList, вы можете вызвать этот метод непосредственно как атрибут через RABL. Я добавлю пример кода выше. - person mikeryz; 15.04.2013
comment
мне это нужно для этого: stackoverflow.com/ вопросы/16001256/ - person Valdis Azamaris; 15.04.2013
comment
пожалуйста, взгляните на мой второй вопрос.... Коллекция Rails rabl с оператором if - person Valdis Azamaris; 15.04.2013
comment
ты не знал? почему ты меня ругаешь? - person Valdis Azamaris; 16.04.2013
comment
Мне кажется, что два приведенных примера являются общими и достаточно подробными, чтобы вы могли понять свой вопрос RABL. Я не понимаю, что именно вызывает у вас затруднения. CurrencyValue уже принадлежит ExchangerList, поэтому некоторые_exchanger_list.currency_values ​​уже будут фильтровать только те, которые принадлежат этому. Вы можете написать дополнительные условия внутри дочернего узла в виде метода или использовать labmda для дальнейшей фильтрации. - person mikeryz; 16.04.2013
comment
как написать это условие? синтаксис? также в первой строке у меня есть коллекция.... как получить на каждой итерации collection.id? - person Valdis Azamaris; 17.04.2013
comment
хм, подскажите пожалуйста, как я могу получить доступ в моем коде к коллекции @bank_exchangers id банка? - person Valdis Azamaris; 24.04.2013