The idea is definitely sound, yeah.  Couple tweaks to execution: we don't want to default arguments in the middle of a list, we have to default arguments at the end.  To illustrate what I mean, consider "stock(:fuel, 40)" to stock 40 units of fuel, versus "stock(:fuel, 40, 80, 120)", which stocks not 40 but 120 units of fuel.  I *think* the Ruby parser will handle this OK, but it's definitely hard to follow.

I think it might be worth breaking this into two methods:
    def stock(good, quantity, buy_price, sell_price)
      item = find_or_create(good)
      item.update_attributes(buy_price: buy_price, sell_price: sell_price, quantity: quantity)
    end

    def restock(good, additional_quantity)
      item = find_or_create(good)
      item.update_attributes(quantity: item.quantity + additional_quantity)
    end