# File model/model.rb, line 246
    def initialize(dbh, recipe_id)
        raise "Invalid DBH" if not dbh.kind_of?(DBI::DatabaseHandle)
        raise "Bad Record ID" if dbh.select_one("select * from recipe where recipe_id=?", recipe_id).nil?

        @dbh = dbh
        @id = recipe_id
        @ingredients = ObservableArray.new
        @dbh.select_all("select ingredient_id from ingredient where recipe_id=? order by position", @id).each do |row|
            @ingredients << $replicator.get('ingredient', row['ingredient_id'])
        end
        @ingredients.add_observer {
            # which ingredients were previously in the DB?
            old_ingredients = Array.new
            @dbh.select_all("select ingredient_id from ingredient where recipe_id=? order by position",@id).each do |row|
                old_ingredients << $replicator.get('ingredient', row['ingredient_id'])
            end

            # add any new ones to the DB
            (@ingredients - old_ingredients).each do |ingredient|
                @dbh.do("update ingredient set recipe_id=? where ingredient_id=?",@id,ingredient.id)
            end

            # remove any no longer used from the recipe (ingredient is now
            # orphaned, requires explicit deletion by party that removed it,
            # unless only being moved. Vacuuming will catch any refugees)
            (old_ingredients - @ingredients).each do |ingredient|
                @dbh.do("update ingredient set recipe_id=? where ingredient_id=?", nil, ingredient.id)
            end

            # fix ordering
            @ingredients.each_with_index do |ingredient,index|
                ingredient.position = index
            end

        }
        #@ingredients.each { |i| i.add_observer { @ingredients.notify_observers } }
    end