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