In looking at:
collection<<(object, …)
    Adds one or more objects to the collection by setting their foreign 
keys to the collection‘s primary key. 
http://api.rubyonrails.org/classes/ActiveRecord/Associations/
ClassMethods.html#M001833
how would the the << syntax be used to add a "page" object to a 
collection of, for example, Page.find(:all) ?  Or, is there a better 
approach?
thufir@ARRAKIS:~/projects/rss2mysql$ 
thufir@ARRAKIS:~/projects/rss2mysql$ ruby query_items.rb 
"http://groups.google.ca/group/ruby-talk-google/browse_thread/
thread/3d4f3a54e0d72e70/20faeb97bf8abc41?show_docid=20faeb97bf8abc41"
"http://groups.google.ca/group/ruby-talk-google/browse_thread/
thread/74d7162cac57dc65/ee34c0c52546e0da?show_docid=ee34c0c52546e0da"
"http://groups.google.ca/group/ruby-talk-google/browse_thread/
thread/5d6a08246a0164a0/df3e5798fa92d304?show_docid=df3e5798fa92d304"
"http://groups.google.ca/group/ruby-talk-google/browse_thread/
thread/798fc4c39bfe900e/a80b047c807a3a23?show_docid=a80b047c807a3a23"
"http://groups.google.ca/group/ruby-talk-google/browse_thread/
thread/69e0d408a75cd3af/0721ee8e936933c6?show_docid=0721ee8e936933c6"
"http://groups.google.ca/group/ruby-talk-google/browse_thread/
thread/7d7b2cbf9661739b/cf19a7cad093ac81?show_docid=cf19a7cad093ac81"
"http://groups.google.ca/group/ruby-talk-google/browse_thread/
thread/27e1d1a3c68c9cfa/7fc7707edcc136ca?show_docid=7fc7707edcc136ca"
thufir@ARRAKIS:~/projects/rss2mysql$ 
thufir@ARRAKIS:~/projects/rss2mysql$ ruby scrape.rb 
"http://groups.google.ca/group/ruby-talk-google/browse_thread/
thread/3d4f3a54e0d72e70/20faeb97bf8abc41?show_docid=20faeb97bf8abc41"
"*****************"
"*****************"
/var/lib/gems/1.8/gems/activerecord-2.3.4/lib/active_record/
attribute_methods.rb:255:in `method_missing'': undefined method
`page_id=''
for #<Page id: nil, item_id: nil, page: nil> (NoMethodError)
	from scrape.rb:30
	from /usr/lib/ruby/1.8/open-uri.rb:135:in `open_uri''
	from /usr/lib/ruby/1.8/open-uri.rb:518:in `open''
	from /usr/lib/ruby/1.8/open-uri.rb:30:in `open''
	from scrape.rb:27
	from scrape.rb:22:in `each''
	from scrape.rb:22
thufir@ARRAKIS:~/projects/rss2mysql$ 
thufir@ARRAKIS:~/projects/rss2mysql$ nl scrape.rb 
     1	require ''rubygems''
     2	require ''activerecord''
     3	require ''yaml''
     4	require ''item''
     5	require ''page''
     6	require ''open-uri''
     7	require ''pp''
       
       
     8	db = YAML::load(File.open(''database.yml''))
       
     9	ActiveRecord::Base.establish_connection(
    10	:adapter  => db["development"]["adapter"],
    11	:host   => db["development"]["host"],
    12	:username => db["development"]["username"],
    13	:password => db["development"]["password"],
    14	:database => db["development"]["database"])
       
       
    15	items = Item.find(:all)
       
    16	items.each do |item|
    17	  pp item.url
    18	  pp "*****************"
    19	  pp "*****************"
       
    20	  open(item.url,
    21	  "User-Agent" => "Mozilla/5.0 (X11; U; Linux i686;
en-US;
rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15"){|f|
    22	    page = Page.new
    23	    page.page_id = item.id
    24	    page.page = f.readlines.join  #html
    25	    page.save}
    26	end
thufir@ARRAKIS:~/projects/rss2mysql$ 
thufir@ARRAKIS:~/projects/rss2mysql$ nl item.rb 
     1	require ''rubygems''
     2	require ''activerecord''
       
     3	class Item <  ActiveRecord::Base
     4	  has_one                 :page
     5	end
       
thufir@ARRAKIS:~/projects/rss2mysql$ 
thufir@ARRAKIS:~/projects/rss2mysql$ nl page.rb 
     1	require ''rubygems''
     2	require ''activerecord''
       
     3	class Page <  ActiveRecord::Base
     4	  belongs_to :item
     5	  validates_presence_of :item_id
     6	end
thufir@ARRAKIS:~/projects/rss2mysql$ 
thufir@ARRAKIS:~/projects/rss2mysql$ nl db/migrate/001_create_items.rb 
     1	class CreateItems < ActiveRecord::Migration
     2	  def self.up
     3	    create_table :items do |t|
     4	      t.column :title, :string
     5	      t.column :content, :string
     6	      t.column :source, :string
     7	      t.column :url, :string
     8	      t.column :timestamp, :timestamp
     9	      t.column :keyword_id, :integer
    10	      t.column :guid, :string
    11	    end
    12	  end
       
    13	  def self.down
    14	    drop_table :items
    15	  end
    16	end
thufir@ARRAKIS:~/projects/rss2mysql$ nl db/migrate/002_create_pages.rb 
     1	class CreatePages < ActiveRecord::Migration
     2	  def self.up
     3	    create_table :pages do |t|
     4	      t.references :item
     5	      t.column :page, :text
     6	    end
     7	  end
       
     8	  def self.down
     9	    drop_table :pages
    10	  end
    11	end
thufir@ARRAKIS:~/projects/rss2mysql$ 
thufir@ARRAKIS:~/projects/rss2mysql$ 
thanks,  Thufir
Hello Thufir: I''m not quite sure if I understand you correctly.The collection in the documentation refers to a has_many association on the parent object e.g. category = Category.find(1); category.pages << Page.new(:title => "My Title"). Could you please clarify what you wanted to do? Cheers, Nicholas --- Nicholas Henry Ruby on Rails Developer nicholas-avpPrnUtcvTqJdGyAr2GoA@public.gmane.org Firsthand Web Design and Development Website http://www.firsthand.ca Twitter http://twitter.com/firsthand Blog http://blog.firsthand.ca/ Fork me on Github http://github.com/firsthand On Nov 15, 5:05 pm, Thufir <hawat.thu...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> In looking at: > > collection<<(object, …) > Adds one or more objects to the collection by setting their foreign > keys to the collection‘s primary key. > > http://api.rubyonrails.org/classes/ActiveRecord/Associations/ > ClassMethods.html#M001833 > > how would the the << syntax be used to add a "page" object to a > collection of, for example, Page.find(:all) ? Or, is there a better > approach? > > thufir@ARRAKIS:~/projects/rss2mysql$ > thufir@ARRAKIS:~/projects/rss2mysql$ ruby query_items.rb > "http://groups.google.ca/group/ruby-talk-google/browse_thread/ > thread/3d4f3a54e0d72e70/20faeb97bf8abc41?show_docid=20faeb97bf8abc41" > "http://groups.google.ca/group/ruby-talk-google/browse_thread/ > thread/74d7162cac57dc65/ee34c0c52546e0da?show_docid=ee34c0c52546e0da" > "http://groups.google.ca/group/ruby-talk-google/browse_thread/ > thread/5d6a08246a0164a0/df3e5798fa92d304?show_docid=df3e5798fa92d304" > "http://groups.google.ca/group/ruby-talk-google/browse_thread/ > thread/798fc4c39bfe900e/a80b047c807a3a23?show_docid=a80b047c807a3a23" > "http://groups.google.ca/group/ruby-talk-google/browse_thread/ > thread/69e0d408a75cd3af/0721ee8e936933c6?show_docid=0721ee8e936933c6" > "http://groups.google.ca/group/ruby-talk-google/browse_thread/ > thread/7d7b2cbf9661739b/cf19a7cad093ac81?show_docid=cf19a7cad093ac81" > "http://groups.google.ca/group/ruby-talk-google/browse_thread/ > thread/27e1d1a3c68c9cfa/7fc7707edcc136ca?show_docid=7fc7707edcc136ca" > thufir@ARRAKIS:~/projects/rss2mysql$ > thufir@ARRAKIS:~/projects/rss2mysql$ ruby scrape.rb > "http://groups.google.ca/group/ruby-talk-google/browse_thread/ > thread/3d4f3a54e0d72e70/20faeb97bf8abc41?show_docid=20faeb97bf8abc41" > "*****************" > "*****************" > /var/lib/gems/1.8/gems/activerecord-2.3.4/lib/active_record/ > attribute_methods.rb:255:in `method_missing'': undefined method `page_id='' > for #<Page id: nil, item_id: nil, page: nil> (NoMethodError) > from scrape.rb:30 > from /usr/lib/ruby/1.8/open-uri.rb:135:in `open_uri'' > from /usr/lib/ruby/1.8/open-uri.rb:518:in `open'' > from /usr/lib/ruby/1.8/open-uri.rb:30:in `open'' > from scrape.rb:27 > from scrape.rb:22:in `each'' > from scrape.rb:22 > thufir@ARRAKIS:~/projects/rss2mysql$ > thufir@ARRAKIS:~/projects/rss2mysql$ nl scrape.rb > 1 require ''rubygems'' > 2 require ''activerecord'' > 3 require ''yaml'' > 4 require ''item'' > 5 require ''page'' > 6 require ''open-uri'' > 7 require ''pp'' > > 8 db = YAML::load(File.open(''database.yml'')) > > 9 ActiveRecord::Base.establish_connection( > 10 :adapter => db["development"]["adapter"], > 11 :host => db["development"]["host"], > 12 :username => db["development"]["username"], > 13 :password => db["development"]["password"], > 14 :database => db["development"]["database"]) > > 15 items = Item.find(:all) > > 16 items.each do |item| > 17 pp item.url > 18 pp "*****************" > 19 pp "*****************" > > 20 open(item.url, > 21 "User-Agent" => "Mozilla/5.0 (X11; U; Linux i686; en-US; > rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15"){|f| > 22 page = Page.new > 23 page.page_id = item.id > 24 page.page = f.readlines.join #html > 25 page.save} > 26 end > thufir@ARRAKIS:~/projects/rss2mysql$ > thufir@ARRAKIS:~/projects/rss2mysql$ nl item.rb > 1 require ''rubygems'' > 2 require ''activerecord'' > > 3 class Item < ActiveRecord::Base > 4 has_one :page > 5 end > > thufir@ARRAKIS:~/projects/rss2mysql$ > thufir@ARRAKIS:~/projects/rss2mysql$ nl page.rb > 1 require ''rubygems'' > 2 require ''activerecord'' > > 3 class Page < ActiveRecord::Base > 4 belongs_to :item > 5 validates_presence_of :item_id > 6 end > thufir@ARRAKIS:~/projects/rss2mysql$ > thufir@ARRAKIS:~/projects/rss2mysql$ nl db/migrate/001_create_items.rb > 1 class CreateItems < ActiveRecord::Migration > 2 def self.up > 3 create_table :items do |t| > 4 t.column :title, :string > 5 t.column :content, :string > 6 t.column :source, :string > 7 t.column :url, :string > 8 t.column :timestamp, :timestamp > 9 t.column :keyword_id, :integer > 10 t.column :guid, :string > 11 end > 12 end > > 13 def self.down > 14 drop_table :items > 15 end > 16 end > thufir@ARRAKIS:~/projects/rss2mysql$ nl db/migrate/002_create_pages.rb > 1 class CreatePages < ActiveRecord::Migration > 2 def self.up > 3 create_table :pages do |t| > 4 t.references :item > 5 t.column :page, :text > 6 end > 7 end > > 8 def self.down > 9 drop_table :pages > 10 end > 11 end > thufir@ARRAKIS:~/projects/rss2mysql$ > thufir@ARRAKIS:~/projects/rss2mysql$ > > thanks, Thufir
On Nov 16, 4:22 pm, Nicholas Henry <nicholas.he...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hello Thufir: > > I''m not quite sure if I understand you correctly.The collection in the > documentation refers to a has_many association on the parent object > e.g. category = Category.find(1); category.pages << Page.new(:title => > "My Title"). > > Could you please clarify what you wanted to do?Speaking generally: A has a zero or one relation with B. B always belongs to an existing A. (Since this is ActiveRecord, A and B are both classes and tables; and, no not using a full rails environment, just the AR gem.) In some_insert_script.rb, a connection to the database is established. I can query for A, or I can query for B successfully. I don''t know the syntax to check whether A has a B, and, if not, create a B and populate the field(s) for B. Hopefully, that makes more sense! -Thufir
Hello Thufir: If I understand you correctly then all you would need to do is check the relationship is nil? From you example: A = Item B = Page item = Item.find(1) item.create_page(:title => "My Title") if item.page.nil? # or alternative use item.build_page Am I missing something? Cheers, Nicholas On Nov 16, 9:16 pm, Thufir <hawat.thu...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Nov 16, 4:22 pm, Nicholas Henry <nicholas.he...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Hello Thufir: > > > I''m not quite sure if I understand you correctly.The collection in the > > documentation refers to a has_many association on the parent object > > e.g. category = Category.find(1); category.pages << Page.new(:title => > > "My Title"). > > > Could you please clarify what you wanted to do? > > Speaking generally: > > A has a zero or one relation with B. B always belongs to an existing > A. (Since this is ActiveRecord, A and B are both classes and tables; > and, no not using a full rails environment, just the AR gem.) > > In some_insert_script.rb, a connection to the database is > established. I can query for A, or I can query for B successfully. I > don''t know the syntax to check whether A has a B, and, if not, create > a B and populate the field(s) for B. > > Hopefully, that makes more sense! > > -Thufir
or rather: item.create_page(:title => "My Title") unless item.page don''t need to explicitly test for nil with an "if" statement. Cheers, Nicholas --- Nicholas Henry Ruby on Rails Developer nicholas-avpPrnUtcvTqJdGyAr2GoA@public.gmane.org Firsthand Web Design and Development Website http://www.firsthand.ca Twitter http://twitter.com/firsthand Blog http://blog.firsthand.ca/ Fork me on Github http://github.com/firsthand On Nov 16, 10:22 pm, Nicholas Henry <nicholas.he...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hello Thufir: > > If I understand you correctly then all you would need to do is check > the relationship is nil? From you example: > > A = Item > B = Page > > item = Item.find(1) > item.create_page(:title => "My Title") if item.page.nil? # or > alternative use item.build_page > > Am I missing something? > > Cheers, > Nicholas > > On Nov 16, 9:16 pm, Thufir <hawat.thu...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > > On Nov 16, 4:22 pm, Nicholas Henry <nicholas.he...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > Hello Thufir: > > > > I''m not quite sure if I understand you correctly.The collection in the > > > documentation refers to a has_many association on the parent object > > > e.g. category = Category.find(1); category.pages << Page.new(:title => > > > "My Title"). > > > > Could you please clarify what you wanted to do? > > > Speaking generally: > > > A has a zero or one relation with B. B always belongs to an existing > > A. (Since this is ActiveRecord, A and B are both classes and tables; > > and, no not using a full rails environment, just the AR gem.) > > > In some_insert_script.rb, a connection to the database is > > established. I can query for A, or I can query for B successfully. I > > don''t know the syntax to check whether A has a B, and, if not, create > > a B and populate the field(s) for B. > > > Hopefully, that makes more sense! > > > -Thufir
Perfect:
thufir@ARRAKIS:~/projects/rss2mysql$
thufir@ARRAKIS:~/projects/rss2mysql$ nl scrape.rb
     1	require ''rubygems''
     2	require ''activerecord''
     3	require ''yaml''
     4	require ''item''
     5	require ''page''
     6	require ''open-uri''
     7	require ''pp''
     8	db = YAML::load(File.open(''database.yml''))
     9	ActiveRecord::Base.establish_connection(
    10	:adapter  => db["development"]["adapter"],
    11	:host   => db["development"]["host"],
    12	:username => db["development"]["username"],
    13	:password => db["development"]["password"],
    14	:database => db["development"]["database"])
    15	items = Item.find(:all)
    16	items.each do |item|
    17	  pp "*****************"
    18	  pp "*****************"
    19	  open(item.url,
    20	  "User-Agent" => "Mozilla/5.0 (X11; U; Linux i686;
en-US; rv:
1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15"){|f|
    21	    html_string = f.readlines.join
    22	    item.create_page(:page => html_string) unless item.page
    23	    item.save
    24	    pp item.id
    25	  }
    26	end
thufir@ARRAKIS:~/projects/rss2mysql$
thanks,
Thufir