Hi,
I''ve just been pleasantly surprised, again, by how much Rails does for
me, but I am *really* surprised. Surprised as in "how the heck did that
happen?" I''d really like to understand this and would appreciate
any help.
Big picture... the user is presented with a form that allows them to select one
or more check boxes to record their allergies. The form uses the
"allergy_items" table to present the form. allergy_items has columns
for each allergy a user may have (name of column = name of allergy), and the
value of each field in the record is ''y'' or
''n''. When the user submits the form, the params are read and
a record is created in the "allergies" table for each allergy
they''ve selected. If the user returns to that form, the allergy_items
record supplies the current values the user has selected. If the user deselects
any of the previously selected items, the record that was previously added to
the allergies table for that allergy needs to be deleted.
The good news is that the code I''ve got works. The bad news is that I
have no idea how or why ;-P I never consciously included any code to test
whether the selections had changed, nor to delete the records, and only those
records, based on the result of that test.
I''ve included the code below and would *really* appreciate it if
someone would help me understand why the deletion is working the way it is. I
didn''t think I''d included any code to delete the specific
records I wanted deleted. I thought the code I''ve got would delete
*all* the records.
Thanks in advance for any help you can give me.
Best regards,
Bill
------------------------ controller code -------------------------
class AllergyController < ApplicationController
model :emrec
model :allergy
model :allergy_item
def new
@allergy_item = find_allergies
end
def update
@allergy_item = find_allergies
@emrec = find_emrec
######
# This is the code I don''t understand. My intention was to check
the new params entry for each
# allergy record to see if it had been deselected. If it had, I''d
delete the associated allergy record
# I assumed the code below would destroy *all* the allergy records. In
fact, it only destroys the
# ones that had been deselected. How the heck is THAT happening ?!?!?!?
######
@allergy_list = Allergy.find(:all,
:conditions => ["emrec_id = ?", @emrec.id])
@allergy_list.each do |allergy|
allergy.destroy
end
######
# now add any new items. the model as a
# validate_uniqueness_of condition on description
# to avoid duplicate records
######
@allergy_item.update_attributes(params[:allergy_item])
for column in AllergyItem.content_columns
selected = @allergy_item.send(column.name)
if selected == ''y''
@allergy = Allergy.new
@allergy.emrec_id = @emrec.id
@allergy.description = column.human_name
@allergy.save
end
end
redirect_to :controller => ''creation'', :action =>
''show_emrec''
end
private
def find_allergies
session[:allergy_item] ||= AllergyItem.new
end
def find_emrec
session[:emrec] ||= Emrec.new
end
end
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
http://wrath.rubyonrails.org/pipermail/rails/attachments/20060305/e7a54838/attachment.html