|
From: <fu...@us...> - 2003-12-15 20:11:58
|
Update of /cvsroot/neelix/neelix/model
In directory sc8-pr-cvs1:/tmp/cvs-serv13260/model
Modified Files:
model.rb
Log Message:
model.rb got a major overhaul. Took out all the commit/rollback stuff
(artifacts of an old paradigm), and tied the accessors directly to the db.
Added a nifty ObservableArray with many thanks to bartsman on #ruby-lang and a
few posts on comp.lang.ruby
The recipe name is complete in all its MVP glory. When you change the name of
the recipe in the form on the right, the variable is updated. Recipe then
notifies its observers (i.e. the FXTreeItem corresponding to the recipe) that
it has changed, and then the tree item updates with the new value.
Index: model.rb
===================================================================
RCS file: /cvsroot/neelix/neelix/model/model.rb,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** model.rb 14 Dec 2003 04:54:05 -0000 1.3
--- model.rb 15 Dec 2003 20:11:54 -0000 1.4
***************
*** 3,7 ****
require 'dbi'
require 'singleton'
! require 'observer'
class Food
--- 3,43 ----
require 'dbi'
require 'singleton'
! module Observable
! def add_observer(&callback)
! @observers ||= []
! @observers << callback
! end
!
! def delete_observer( &callback )
! @observers ||= []
! @observers.delete(callback)
! end
!
! protected
! def notify_observers
! @observers ||= []
! @observers.each { |o| o.call }
! end
! end
! class ObservableArray < Array
! include Observable
!
! class << self
! def wrap_method(*meths)
! meths.each do |meth|
! alias_method "__old_#{meth}", meth
! define_method(meth) do |*a|
! r = send("__old_#{meth}", *a);
! notify_observers
! r = ObservableArray.new(r) if Array === r
! return r
! end
! end
! end
! end
!
! wrap_method :<<, :[]=, :clear, :collect!, :compact!, :delete, :delete_at, :delete_if, :flatten!, :map!, :pop, :push, :reject!, :replace, :reverse!, :shift, :slice!, :sort!, :uniq!, :unshift
! wrap_method :assoc, :collect, :compact, :concat, :flatten, :rassoc, :reverse, :slice, :sort, :uniq
! end
class Food
***************
*** 9,13 ****
attr_reader :id
! attr_accessor :name, :measures
def initialize(dbh,food_id)
--- 45,49 ----
attr_reader :id
! attr_accessor :measures
def initialize(dbh,food_id)
***************
*** 17,58 ****
@dbh = dbh
@id = food_id
- rollback
- end
! def commit
! @dbh.do("update food set name=? where food_id=?",@name,@id)
! @dbh.commit
!
! # which measures were previously in the DB?
! @old_measures = Array.new
@dbh.select_all("select measure_id from food_measures where food_id=?",@id).each do |row|
! @old_measures << $replicator.get('measure', row['measure_id'])
end
! # add any new ones to the DB
! (@measures - @old_measures).each do |measure|
! @dbh.do("insert into food_measures (food_id,measure_id) values (?,?)",@id,measure.id)
! @dbh.commit
! end
! # remove any no longer used from the DB
! (@old_measures - @measures).each do |measure|
! @dbh.do("delete from food_measures where food_id=? and measure_id=?",@id,measure.id)
! @dbh.commit
! end
! changed
end
!
! def rollback
! @measures = Array.new
! @dbh.select_all("select measure_id from food_measures where food_id=?",@id).each do |row|
! @measures << $replicator.get('measure', row['measure_id'])
! end
! @name = @dbh.select_one("select name from food where food_id=?",@id)['name']
! changed
end
-
def to_s
! @name
end
end
--- 53,89 ----
@dbh = dbh
@id = food_id
! @measures = ObservableArray.new
@dbh.select_all("select measure_id from food_measures where food_id=?",@id).each do |row|
! @measures << $replicator.get('measure', row['measure_id'])
end
+ @measures.add_observer {
+ # which measures were previously in the DB?
+ old_measures = Array.new
+ @dbh.select_all("select measure_id from food_measures where food_id=?",@id).each do |row|
+ old_measures << $replicator.get('measure', row['measure_id'])
+ end
! # add any new ones to the DB
! (@measures - old_measures).each do |measure|
! @dbh.do("insert into food_measures (food_id,measure_id) values (?,?)",@id,measure.id)
! end
! # remove any no longer used from the DB
! (old_measures - @measures).each do |measure|
! @dbh.do("delete from food_measures where food_id=? and measure_id=?",@id,measure.id)
! end
! }
end
! def name
! @dbh.select_one("select name from food where food_id=?",@id)['name']
! end
! def name=(n)
! @dbh.do("update food set name=? where food_id=?",n,@id)
! notify_observers
! n
end
def to_s
! name
end
end
***************
*** 62,66 ****
attr_reader :id
- attr_accessor :name
def initialize(dbh,measure_id)
--- 93,96 ----
***************
*** 70,90 ****
@dbh = dbh
@id = measure_id
- rollback
end
- def commit
- @dbh.do("update measure set name=? where measure_id=?",@name,@id)
- @dbh.commit
- changed
- end
! def rollback
! # revert to DB state
! @name = @dbh.select_one("select name from measure where measure_id=?",@id)['name']
! changed
end
def to_s
! @name
end
end
--- 100,117 ----
@dbh = dbh
@id = measure_id
end
! def name
! @dbh.select_one("select name from measure where measure_id=?",@id)['name']
! end
! def name=(n)
! @dbh.do("update measure set name=? where measure_id=?",n,@id)
! notify_observers
! n
end
def to_s
! name
end
end
***************
*** 94,98 ****
attr_reader :id
- attr_accessor :measure, :food, :quantity, :modifier
def initialize(dbh,ingredient_id)
--- 121,124 ----
***************
*** 102,128 ****
@dbh = dbh
@id = ingredient_id
- rollback
end
! def commit
! @dbh.do("update ingredient set measure_id=?,food_id=?,quantity=?,modifier=? where ingredient_id=?",
! @measure.id, @food.id, @quantity, @modifier, @id)
! @dbh.commit
! changed
end
! def rollback
! # revert to DB state
! row = @dbh.select_one("select * from ingredient where ingredient_id=?",@id)
! @measure = $replicator.get('measure', row['measure_id'])
! @food = $replicator.get('food', row['food_id'])
! @quantity = row['quantity']
! @modifier = row['modifier']
! changed
end
def to_s
! s = "#{@quantity} #{@measure} #{@food}"
! s += " (#{@modifier})" if @modifier
return s
end
--- 128,173 ----
@dbh = dbh
@id = ingredient_id
end
! def measure
! $replicator.get('measure',@dbh.select_one("select measure_id from ingredient where ingredient_id=?",@id)['measure_id'])
! end
! def measure=(m)
! @dbh.do("update ingredient set measure_id=? where ingredient_id=?", m.id, @id)
! notify_observers
! m
end
! def food
! $replicator.get('food',@dbh.select_one("select food_id from ingredient where ingredient_id=?",@id)['food_id'])
! end
! def food=(f)
! @dbh.do("update ingredient set food_id=? where ingredient_id=?", f.id, @id)
! notify_observers
! f
! end
!
! def quantity
! @dbh.select_one("select quantity from ingredient where ingredient_id=?",@id)['quantity']
! end
! def quantity=(q)
! @dbh.do("update ingredient set quantity=? where ingredient_id=?", q, @id)
! notify_observers
! q
! end
!
! def modifier
! @dbh.select_one("select modifier from ingredient where ingredient_id=?",@id)['modifier']
! end
! def modifier=(m)
! @dbh.do("update ingredient set modifier=? where ingredient_id=?", m, @id)
! notify_observers
! m
end
def to_s
! s = "#{quantity} #{measure} #{food}"
! m = modifier
! s += " (#{m})" if m
return s
end
***************
*** 133,137 ****
attr_reader :id
! attr_accessor :name, :author, :yields, :tottime, :temp, :directions, :note, :ingredients
def initialize(dbh, recipe_id)
raise "Invalid DBH" if not dbh.kind_of?(DBI::DatabaseHandle)
--- 178,182 ----
attr_reader :id
! attr_accessor :ingredients
def initialize(dbh, recipe_id)
raise "Invalid DBH" if not dbh.kind_of?(DBI::DatabaseHandle)
***************
*** 140,177 ****
@dbh = dbh
@id = recipe_id
! rollback
end
! def commit
! @dbh.do("update recipe set name=?,author=?,serves=?,yields=?,preptime=?,tottime=?,temp=?,directions=?,note=? where recipe_id=?",
! @name, @author, @serves, @yields, @preptime, @tottime, @temp, @directions, @note, @id)
! # which measures were previously in the DB?
! @old_ingredients = Array.new
! @dbh.select_all("select ingredient_id from ingredient where recipe_id=?",@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 DB
! (@old_ingredients - @ingredients).each do |ingredient|
! @dbh.do("delete from ingredient where ingredient_id=?",ingredient.id)
! end
! @dbh.commit
! changed
end
! def rollback
! # revert to DB state
! @ingredients = Array.new
! @dbh.select_all("select ingredient_id from ingredient where recipe_id=?", @id).each do |row|
! @ingredients << $replicator.get('ingredient', row['ingredient_id'])
! end
! @name,@author,@yields,@tottime,@temp,@directions,@note = @dbh.select_one("select name,author,yields,tottime,temp,directions,note from recipe where recipe_id=?", @id)
! changed
end
end
--- 185,272 ----
@dbh = dbh
@id = recipe_id
! @ingredients = ObservableArray.new
! @dbh.select_all("select ingredient_id from ingredient where recipe_id=?", @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=?",@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 DB
! (old_ingredients - @ingredients).each do |ingredient|
! @dbh.do("delete from ingredient where ingredient_id=?",ingredient.id)
! end
! }
end
! def name
! @dbh.select_one("select name from recipe where recipe_id=?", @id)[0]
! end
! def name=(o)
! @dbh.do("update recipe set name=? where recipe_id=?", o, @id)
! notify_observers
! o
! end
! def author
! @dbh.select_one("select author from recipe where recipe_id=?", @id)[0]
! end
! def author=(o)
! @dbh.do("update recipe set author=? where recipe_id=?", o, @id)
! notify_observers
! o
! end
! def yields
! @dbh.select_one("select yields from recipe where recipe_id=?", @id)[0]
! end
! def yields=(o)
! @dbh.do("update recipe set yields=? where recipe_id=?", o, @id)
! notify_observers
! o
! end
! def tottime
! @dbh.select_one("select tottime from recipe where recipe_id=?", @id)[0]
! end
! def tottime=(o)
! @dbh.do("update recipe set tottime=? where recipe_id=?", o, @id)
! notify_observers
! o
end
! def temp
! @dbh.select_one("select temp from recipe where recipe_id=?", @id)[0]
! end
! def temp=(o)
! @dbh.do("update recipe set temp=? where recipe_id=?", o, @id)
! notify_observers
! o
! end
!
! def directions
! @dbh.select_one("select directions from recipe where recipe_id=?", @id)[0]
! end
! def directions=(o)
! @dbh.do("update recipe set directions=? where recipe_id=?", o, @id)
! notify_observers
! o
! end
!
! def note
! @dbh.select_one("select note from recipe where recipe_id=?", @id)[0]
! end
! def note=(o)
! @dbh.do("update recipe set note=? where recipe_id=?", o, @id)
! notify_observers
! o
end
end
***************
*** 181,185 ****
attr_reader :id
! attr_accessor :name, :recipes
def initialize(dbh, category_id)
--- 276,280 ----
attr_reader :id
! attr_accessor :recipes
def initialize(dbh, category_id)
***************
*** 189,226 ****
@dbh = dbh
@id = category_id
! rollback
! end
!
! def commit
! @dbh.do("update category set name=? where category_id=?", @name, @id)
! @dbh.commit
!
! # which associations were previously in the DB?
! @old_recipes = Array.new
@dbh.select_all("select recipe_id from recipe_category where category_id=?",@id).each do |row|
! @old_recipes << $replicator.get('recipe', row['recipe_id'])
end
! # add any new ones to the DB
! (@recipes - @old_recipes).each do |recipe|
! @dbh.do("insert into recipe_category (category_id,recipe_id) values (?,?)",@id,recipe.id)
! @dbh.commit
! end
! # remove any no longer used from the DB
! (@old_recipes - @recipes).each do |recipe|
! @dbh.do("delete from recipe_category where category_id=? and recipe_id=?",@id,recipe.id)
! @dbh.commit
! end
! changed
end
! def rollback
! @recipes = Array.new
! @dbh.select_all("select recipe_id from recipe_category where category_id=?",@id).each do |row|
! @recipes << $replicator.get('recipe', row['recipe_id'])
! end
! @name = @dbh.select_one("select name from category where category_id=?",@id)['name']
! changed
end
end
--- 284,319 ----
@dbh = dbh
@id = category_id
! @recipes = ObservableArray.new
@dbh.select_all("select recipe_id from recipe_category where category_id=?",@id).each do |row|
! @recipes << $replicator.get('recipe', row['recipe_id'])
end
+ @recipes.add_observer {
+ # which associations were previously in the DB?
+ old_recipes = []
+ @dbh.select_all("select recipe_id from recipe_category where category_id=?",@id).each do |row|
+ old_recipes << $replicator.get('recipe', row['recipe_id'])
+ end
! # add any new ones to the DB
! (@recipes - old_recipes).each do |recipe|
! @dbh.do("insert into recipe_category (category_id,recipe_id) values (?,?)",@id,recipe.id)
! @dbh.commit
! end
! # remove any no longer used from the DB
! (old_recipes - @recipes).each do |recipe|
! @dbh.do("delete from recipe_category where category_id=? and recipe_id=?",@id,recipe.id)
! @dbh.commit
! end
! }
end
! def name
! @dbh.select_one("select name from category where category_id=?", @id)[0]
! end
! def name=(o)
! @dbh.do("update category set name=? where category_id=?", o, @id)
! notify_observers
! o
end
end
***************
*** 230,234 ****
attr_reader :id
! attr_accessor :name, :categories
def initialize(dbh, cookbook_id)
--- 323,327 ----
attr_reader :id
! attr_accessor :categories
def initialize(dbh, cookbook_id)
***************
*** 238,275 ****
@dbh = dbh
@id = cookbook_id
! rollback
! end
!
! def commit
! @dbh.do("update cookbook set name=? where cookbook_id=?", @name, @id)
!
! # which recipes were previously in the DB?
! @old_categories = Array.new
@dbh.select_all("select category_id from category where cookbook_id=?",@id).each do |row|
! @old_categories << $replicator.get('category', row['category_id'])
end
! # add any new ones to the DB
! (@categories - @old_categories).each do |category|
! @dbh.do("update category set cookbook_id=? where category_id=?",@id,category.id)
! end
! # remove any no longer used from the DB
! (@old_categories - @categories).each do |category|
! @dbh.do("delete from category where category_id=?",category.id)
! @dbh.do("delete from recipe_category where category_id=?",category.id)
! end
! @dbh.commit
! changed
end
! def rollback
! # revert to DB state
! @categories = Array.new
! @dbh.select_all("select category_id from category where cookbook_id=?",@id).each do |row|
! @categories << $replicator.get('category', row['category_id'])
! end
! @name = @dbh.select_one("select name from cookbook where cookbook_id=?",@id)['name']
! changed
end
end
--- 331,365 ----
@dbh = dbh
@id = cookbook_id
! @categories = ObservableArray.new
@dbh.select_all("select category_id from category where cookbook_id=?",@id).each do |row|
! @categories << $replicator.get('category', row['category_id'])
end
+ @categories.add_observer {
+ # which recipes were previously in the DB?
+ old_categories = []
+ @dbh.select_all("select category_id from category where cookbook_id=?",@id).each do |row|
+ old_categories << $replicator.get('category', row['category_id'])
+ end
! # add any new ones to the DB
! (@categories - old_categories).each do |category|
! @dbh.do("update category set cookbook_id=? where category_id=?",@id,category.id)
! end
! # remove any no longer used from the DB
! (old_categories - @categories).each do |category|
! @dbh.do("delete from category where category_id=?",category.id)
! @dbh.do("delete from recipe_category where category_id=?",category.id)
! end
! }
end
! def name
! @dbh.select_one("select name from cookbook where cookbook_id=?",@id)['name']
! end
! def name=(o)
! @dbh.do("update cookbook set name=? where cookbook_id=?", o, @id)
! notify_observers
! o
end
end
|