Поиск элементов в массиве хэшей - PullRequest
0 голосов
/ 30 января 2011

Я пытаюсь построить модель продуктов, которая имеет много компонентов.Некоторые компоненты являются необязательными и зависят от выбора, который делает пользователь, чтобы включить их или нет.У меня есть две модели, одна - конфигурация, а другая - элементы (этой конфигурации).

Вначале я привожу все элементы массива, а затем создаю другой массив из тех, которые будут показаны по умолчанию.,Но когда я пишу следующий код, он выдает ошибку, несмотря на то, что оба объекта являются массивами хэшей.

Поэтому я привожу свой первый массив всех элементов:

irb(main):252:0*  @all = Configuration.find(1).elements
 => [#<Element id: 1, name: "elem1", quantity: 1, position: 1, subposition: nil, created_at: nil, updated_at: nil, configuration_id: 1>, #<Element id: 2, name: "elem2", quantity: 2, position: 2, subposition: 1, created_at: nil, updated_at: nil, configuration_id: 1>, #<Element id: 3, name: "elem3", quantity: 3, position: 2, subposition: 2, created_at: nil, updated_at: nil, configuration_id: 1>, #<Element id: 4, name: "elem4", quantity: 4, position: 3, subposition: nil, created_at: nil, updated_at: nil, configuration_id: 1>] 

Затем я фильтруютолько те, которые имеют субпозицию nil или 1

irb(main):253:0> @default = @all.where(:subposition=>nil).concat(@all.where(:subposition=>1))
=> [#<Element id: 1, name: "elem1", quantity: 1, position: 1, subposition: nil, created_at: nil, updated_at: nil, configuration_id: 1>, #<Element id: 4, name: "elem4", quantity: 4, position: 3, subposition: nil, created_at: nil, updated_at: nil, configuration_id: 1>, #<Element id: 2, name: "elem2", quantity: 2, position: 2, subposition: 1, created_at: nil, updated_at: nil, configuration_id: 1>]

Пока все хорошо, как вы можете видеть, Elem3 не показывается в @default, поскольку не соответствует требованиям.

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

irb(main):257:0> @all.where(:position =>1)
=> [#<Element id: 1, name: "elem1", quantity: 1, position: 1, subposition: nil, created_at: nil, updated_at: nil, configuration_id: 1>]

Но та же операция в @default завершится неудачей,

irb(main):258:0> @default.where(:position =>1)
NoMethodError: undefined method `where' for #<Array:0x2641660>

Теперь,они оба массива хэшей и выглядят одинаково, почему один и тот же метод не работает во втором случае?

Большое спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 30 января 2011

Во всем вашем коде @all - это ActiveRecord::Relation, а не массив. Это позволяет вам выполнять стандартный вызов .where (среди прочих). Когда вы присвоили @default, вы использовали .concat, который оценил запрос и присвоил фактический массив @default.

Вы можете попробовать другой подход во втором блоке кода. Может быть, что-то вроде этого:

@default = @all.where("subposition is null or subposition = ?", 1)
0 голосов
/ 30 января 2011

Что ж, ваша проблема в том, что concat преобразует коллекцию в массив.

Я бы заменил:

irb(main):253:0> @default = @all.where(:subposition=>nil).concat(@all.where(:subposition=>1))

по:

@default = @all.where("subposition = '1' OR subposition = nil") #I'm unsure of the nil in the statement, I nerver remember, try NULL if it fails

Таким образом, вы делаете только один запрос БД и сохраняете коллекцию ActiveRecord.

Таким образом, вы сможете связать другие, где условия на нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...