Ruby Select метод (для массива) проблемы - PullRequest
2 голосов
/ 18 января 2010

Я использую следующий метод и успешно передаю в метод два аргумента (инвентарь, количество). Однако я неправильно использую методы .first и .each. Я пытаюсь заменить .each на .select, чтобы выбрать для корзины с идентификатором Inventory: 6

возможна. Каждая замена: (не работает) inventory_to_increment = @items.select{|item| item_id == inventory}

def increment_inventory_quantity(inventory, quantity)
   inventory_to_increment = @items.each{|item| item.inventory == inventory}
   unless inventory_to_increment.empty?
      inventory_to_increment = inventory_to_increment.first
   else
      # error handling here
   end
   inventory_to_increment.quantity = quantity.to_i
end

Я использовал Ruby Debugger для отладки своего кода:

inventory_to_increment = @ items.each {| item | item.inventory == инвентарь }

p inventory = 6

если inventory_to_increment .empty?

CartItem:0x102c4a4c0 @quantity=22, @inventory=#<Inventory id: 1

CartItem:0x102c49638 @quantity=2, @inventory=#<Inventory id: 8

CartItem:0x102c48918 @quantity=4, @inventory=#<Inventory id: 50

CartItem:0x102c47b80 @quantity=2, @inventory=#<Inventory id: 6

inventory_to_increment.first

CartItem:0x102c4a4c0 @quantity=22, @inventory=#<Inventory id: 1 

inventory_to_increment.quantity = количество.to_i

= 3

Я пробовал несколько комбинаций, и мне нужно немного базовых указаний по массиву Ruby. Заранее спасибо!

ОБНОВЛЕНИЕ ВЫВОДА ДЛЯ ОТВЕТА

inventory_to_increment = @items.select{|item| item.inventory_id == inventory}
(rdb:1) list
[21, 30] in /Users/justin/cart/app/models/cart.rb
   21   
   22  
   23  def increment_inventory_quantity(inventory, quantity)
   24  debugger
   25  
=> 26     inventory_to_increment = @items.select{|item| item.inventory_id == inventory}
   27   unless inventory_to_increment.empty?
   28       inventory_to_increment.first
   29   end
   30  
(rdb:1) p @items
[#<CartItem:0x102df1828 @quantity=22, @inventory=#<Inventory id: 1>>, #<CartItem:0x102df09a0 @quantity=2, @inventory=#<Inventory id: 8>>, #<CartItem:0x102ded908 @quantity=21, @inventory=#<Inventory id: 50>>]
(rdb:1) p inventory
50
(rdb:1) p quantity
"11"
(rdb:1) p item.inventory.id
NameError Exception: undefined local variable or method `item' for #<Cart:0x102df18f0>
(rdb:1) p item.inventory_id
NameError Exception: undefined local variable or method `item' for #<Cart:0x102df18f0>
(rdb:1) next
/Users/justin/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/rescue.rb:162
rescue_action(exception)

Ответы [ 3 ]

1 голос
/ 18 января 2010

Кажется, Inventory - это объект, и если это так, вероятно, ваш item.inventory == inventory не будет работать должным образом. Допустим, у вас есть класс Item.

class Item
    attr_accessor :inventory_id, :quantity

  def initialize(inventory_id, quantity)
    @inventory_id = inventory_id
    @quantity = quantity
  end
end

и затем вы создаете два объекта и сравниваете их:

>> item1=Item.new(8,2)
=> #<Item:0xb7b733bc @inventory_id=8, @quantity=2>
>> item2=Item.new(8,2)
=> #<Item:0xb7b6b7c0 @inventory_id=8, @quantity=2>
>> item1==item2
=> false

Это потому, что вы будете сравнивать идентификаторы объектов (0xb7b733bc с 0xb7b6b7c0) вместо содержимого объектов.

>> item1.inventory_id==item2.inventory_id
=> true

Тогда кажется, что вы хотите добавить только к quantity к первому предмету, совпадающему с идентификатором инвентаря. Если это правильно, то вы можете попробовать что-то вроде этого

 inventory_to_increment=items.select {|item| item.inventory.inventory_id==inventory}
 unless inventory_to_increment.empty?
    inventory_to_increment.first.quantity+=quantity
 end
1 голос
/ 18 января 2010

Возможно, вы захотите использовать Enumerable # find вместо того, что у вас есть здесь, поскольку вы пытаетесь выбрать один элемент из массива. Это будет подход «найти и увеличить».

Альтернатива состоит в том, чтобы просто использовать каждый итератор для приращения любых совпадающих инвентаризаций, где, если допущение будет только одно, тогда не возникает проблем с дублированием:

def increment_inventory_quantity(inventory, quantity)
   @items.each do |item|
     if (item.inventory == inventory)
       item.inventory.quantity += 1
     end
   end
end

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

0 голосов
/ 18 января 2010

Я думаю, что-то вроде того, что вам нужно,

def increment_inventory_quantity(inventory, quantity)
  @items.each { |item| item.quantity += quantity.to_i if item.inventory == inventory }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...