*Next step*: I have succeeded in adding a column to a database table, then 
using the generator tools to update the Rails objects that implement that 
model.  The process, which I share for what it's worth to others, is:

1.      Add attribute *toys.color* (text):

sqlite> ALTER TABLE toys ADD COLUMN color TEXT;

sqlite> INSERT INTO toys (name, color) VALUES ('Tinker', 'Green');

sqlite> select * from toys;

1|Tinker|Green


2.      Ran rake db:schema:dump to update schema.rb:

ActiveRecord::Schema.define(version: 0) do

  create_table "toys", force: :cascade do |t|

    t.text "name"

    *t.text "color"*

  end


3.      Ran *schema_to_scaffold* for *toys*:

 

[sunward@web324 x]$ scaffold -p db

...

Loaded tables:

0. toys

1. users

...

Select a table: 0

Script for scaffold:

rails generate scaffold Toy name:text color:text --no-migration


4.      Ran *scaffold *using that script:

[sunward@web324 x]$ rails generate scaffold Toy name:text color:text 
--no-migration

      invoke  active_record

    conflict    app/models/toy.rb

  Overwrite /home/sunward/webapps/rails_eval/x/app/models/toy.rb? (enter 
"h" for help) [Ynaqdh] Y

       force    app/models/toy.rb

      invoke    test_unit

      create      test/models/toy_test.rb

      create      test/fixtures/toys.yml

      invoke  resource_route

       route    resources :toys

      invoke  scaffold_controller

    conflict    app/controllers/toys_controller.rb

  Overwrite 
/home/sunward/webapps/rails_eval/x/app/controllers/toys_controller.rb? 
(enter "h" for help) [Ynaqdh] Y

       force    app/controllers/toys_controller.rb

      invoke    erb

       exist      app/views/toys

    conflict      app/views/toys/index.html.erb

    Overwrite 
/home/sunward/webapps/rails_eval/x/app/views/toys/index.html.erb? (enter 
"h" for help) [Ynaqdh] Y

       force      app/views/toys/index.html.erb

    conflict      app/views/toys/edit.html.erb

    Overwrite 
/home/sunward/webapps/rails_eval/x/app/views/toys/edit.html.erb? (enter "h" 
for help) [Ynaqdh] Y

       force      app/views/toys/edit.html.erb

    conflict      app/views/toys/show.html.erb

    Overwrite 
/home/sunward/webapps/rails_eval/x/app/views/toys/show.html.erb? (enter "h" 
for help) [Ynaqdh] Y

       force      app/views/toys/show.html.erb

    conflict      app/views/toys/new.html.erb

    Overwrite 
/home/sunward/webapps/rails_eval/x/app/views/toys/new.html.erb? (enter "h" 
for help) [Ynaqdh] Y

       force      app/views/toys/new.html.erb

    conflict      app/views/toys/_form.html.erb

    Overwrite 
/home/sunward/webapps/rails_eval/x/app/views/toys/_form.html.erb? (enter 
"h" for help) [Ynaqdh] Y

       force      app/views/toys/_form.html.erb

      invoke    test_unit

    conflict      test/controllers/toys_controller_test.rb

    Overwrite 
/home/sunward/webapps/rails_eval/x/test/controllers/toys_controller_test.rb? 
(enter "h" for help) [Ynaqdh] Y

       force      test/controllers/toys_controller_test.rb

      invoke    helper

   identical      app/helpers/toys_helper.rb

      invoke      test_unit

      invoke    jbuilder

    conflict      app/views/toys/index.json.jbuilder

    Overwrite 
/home/sunward/webapps/rails_eval/x/app/views/toys/index.json.jbuilder? 
(enter "h" for help) [Ynaqdh] Y

       force      app/views/toys/index.json.jbuilder

    conflict      app/views/toys/show.json.jbuilder

    Overwrite 
/home/sunward/webapps/rails_eval/x/app/views/toys/show.json.jbuilder? 
(enter "h" for help) [Ynaqdh] Y

       force      app/views/toys/show.json.jbuilder

      invoke  assets

      invoke    coffee

   identical      app/assets/javascripts/toys.coffee

      invoke    scss

    conflict      app/assets/stylesheets/toys.scss

    Overwrite 
/home/sunward/webapps/rails_eval/x/app/assets/stylesheets/toys.scss? (enter 
"h" for help) [Ynaqdh] Y

       force      app/assets/stylesheets/toys.scss

      invoke  scss
   identical    


5.      *It **work**s!* See http://x.sunward.webfactional.com/toys/. 

*However*:  This process has only a limited ability to update the Rails 
objects to handle the database change while preserving manually entered 
changes to them.  Specifically:  For each Rails file where the new 
(generated) version differs from the existing (possibly manually modified) 
version, you get to choose between keeping the old version (so it doesn't 
match the database changes) or replacing it with the new version (so any 
manual updates to the old version are lost).  In other words, I haven't 
found a way to generate a new file that is a combination of the old and the 
new - that is, it is identical to the old file in all respects except that 
it implements the database schema changes.  

So...

*Next question*:  Are there any Rails tools that *can* generate a 
"combined" file in the sense just defined?  Is there any way to generate a 
"combined" file in the sense just defined? - either with other Rails tools 
or with options to the tools used in the above scenarios?  

I know that meaningfully merging two versions of an object quickly gets us 
into the "hard problem" zone.  But I notice that the prompts that *scaffold 
*puts out do offer to show you a "diff" of the old vs new versions of each 
file.  It shouldn't be too hard to give the user the opportunity to choose 
between the old and the new versions of each line that differs, and that 
would enable the user to produce the desired "combination" in most cases.  
Short of that, an option to tag the new file with a slightly different file 
name from the old file would enable the user to use an external "diff 
editor" to compare and manually merge the two versions fairly efficiently.

So, I'm wondering, does the Rails World contain any tools that can do this?

~ Thanks yet again
~ Ken

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/0564efc4-5be6-438d-9211-ddc1fe1663e1%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to