2016-06-27 2 views
0

Я получаю от этого вызова ActiveRecord:Rails - как получить из объекта ActiveRecord только конкретные записи?

#<ActiveRecord::Associations::CollectionProxy [ 
    #<CarService id: nil, car_id: nil, car_service: 1, 
       created_at: nil, updated_at: nil, car_type: 0>, 
    #<CarService id: nil, car_id: nil, car_service: 11, 
       created_at: nil, updated_at: nil, car_type: 1>]> 

После того, как я получаю это, мне нужно фильтровать только те записи, где car_type = "0". Как это сделать без повторного вызова базы данных (WHERE car_type = "0")?

Заранее спасибо.

EDIT:

это:

car.car_services.select{|key, hash| hash['car_type'] == "1" } 

не работает.

+0

'car.car_services.select {| car_service | car_service.car_type.to_s == "1"} '. Кстати, это _wrong_ подход. Другой фильтр-запрос к БД будет быстрее и надежнее. – mudasobwa

+0

Вы пытались: 'car.car_services.select {| car_service | car_service.car_type == 1} '? – oliviergg

+0

Почему не 'где'? если результат большой, 'select' займет у вас много времени. он не сделает другого вызова, если запрос вообще – lusketeer

ответ

0

просто конвертировать результат в массив затем процеживают как этот

result = car.car_services.to_a.select do |e| 
    e.car_type == "0" 
end 
+0

вызов select на ActiveRecord :: Ассоциации :: CollectionProxy фактически преобразует коллекцию в массив. http://edgeapi.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html#method-i-select – jaydel

0

Вы можете использовать рамки в CarService модели:

scope :type_ones, -> { where(car_type: 1) } 

и вы можете использовать его как это:

car.car_services.type_ones 

Если вы используете перечисление, это будет лучше. Поскольку перечисление создается автоматически, вместо вас. И, конечно, у него есть больше возможностей. Подробнее о enum.

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