I have a couple of problems which are kinda related, so I''ll out them both here. I''ve been trying out rspec for the first time and I''m new to has_many :through relationships, so excuse me. I want to relate a User to a WorldCity through a Locations relationship. ############file:models/user.rb class User < ActiveRecord::Base has_many :locations has_many :world_cities, :through => :locations end ############file:models/world_city.rb class WorldCity < ActiveRecord::Base has_many :locations has_many :users, :through => :locations end ############schema.rb ActiveRecord::Schema.define(:version => 3) do create_table "locations", :force => true do |t| t.integer "user_id" t.integer "world_city_id" t.datetime "created_at" t.datetime "updated_at" end create_table "users", :force => true do |t| t.string "username" t.string "name" t.integer "location_id" t.datetime "created_at" t.datetime "updated_at" end create_table "world_cities", :force => true do |t| t.string "name" t.float "latitude" t.float "longitude" t.string "country" t.string "region" t.integer "location_id" t.datetime "created_at" t.datetime "updated_at" end end ###########user_spec.rb describe User do fixtures :world_cities before(:each) do @user = User.create( :name => "Bob Harris", :username => "bobharris" ) end it "has a user with username ''bobharris''" do User.find_by_username("bobharris").should be_valid end it "has a user with username ''bobharris with a related WorldCity''" do #########???? end end ## Question ## I want the model to be able to assign a random WorldCity to a new user (not really important why here). Where should this be done and how do I test it in rspec? I''m sure if I had an example I could understand this, but can I change the user.rb to override the create method and add a location; does the rails framework let me assign a WordCity to a User and take care of the relationship (that would be nice). I''ve tried everything I can think of but can''t get my head around it. Please help. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
If you''re going to use has_many :through then you also need a model for the join table (Location). You may have that but you didn''t describe it above. As for assigning to that join table, there are many ways you can do it depending on how early you need the association. Check into the before_xxx (create, validate, etc) ActiveRecord callbacks that allow you to hook into the object creation process without having to override the default functionality. On Mar 20, 8:10 am, Col Wilson <col.wilson.em...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote:> I have a couple of problems which are kinda related, so I''ll out them > both here. I''ve been trying out rspec for the first time and I''m new > to has_many :through relationships, so excuse me. > > I want to relate a User to a WorldCity through a Locations > relationship. > > ############file:models/user.rb > class User < ActiveRecord::Base > has_many :locations > has_many :world_cities, :through => :locations > end > > ############file:models/world_city.rb > class WorldCity < ActiveRecord::Base > has_many :locations > has_many :users, :through => :locations > end > > ############schema.rb > ActiveRecord::Schema.define(:version => 3) do > > create_table "locations", :force => true do |t| > t.integer "user_id" > t.integer "world_city_id" > t.datetime "created_at" > t.datetime "updated_at" > end > > create_table "users", :force => true do |t| > t.string "username" > t.string "name" > t.integer "location_id" > t.datetime "created_at" > t.datetime "updated_at" > end > > create_table "world_cities", :force => true do |t| > t.string "name" > t.float "latitude" > t.float "longitude" > t.string "country" > t.string "region" > t.integer "location_id" > t.datetime "created_at" > t.datetime "updated_at" > end > > end > > ###########user_spec.rb > describe User do > fixtures :world_cities > > before(:each) do > @user = User.create( :name => "Bob Harris", :username => > "bobharris" ) > end > > it "has a user with username ''bobharris''" do > User.find_by_username("bobharris").should be_valid > end > > it "has a user with username ''bobharris with a related WorldCity''" > do > #########???? > end > > end > > ## Question ## > I want the model to be able to assign a random WorldCity to a new user > (not really important why here). Where should this be done and how do > I test it in rspec? I''m sure if I had an example I could understand > this, but can I change the user.rb to override the create method and > add a location; does the rails framework let me assign a WordCity to a > User and take care of the relationship (that would be nice). > > I''ve tried everything I can think of but can''t get my head around it. > > Please help.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On Mar 20, 12:21 pm, AndyV <a...-HmMyXyqgL2CVc3sceRu5cw@public.gmane.org> wrote:> If you''re going to use has_many :through then you also need a model > for the join table (Location). You may have that but you didn''t > describe it above.Yes I have: class Location < ActiveRecord::Base belongs_to :user belongs_to :world_city end> > As for assigning to that join table, there are many ways you can do it > depending on how early you need the association. Check into the > before_xxx (create, validate, etc) ActiveRecord callbacks that allow > you to hook into the object creation process without having to > override the default functionality. >Thanks, I will. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
So assuming that the random mentioned below works, does that mean that I should be ding somethingg kime this in user.rb? def before_create wc = WorldCity.new.random loc = Location.create( :world_city_id => wc.id, :user_id => @id) @location_id = loc.id end --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Jeffrey L. Taylor
2008-Mar-22 14:18 UTC
Re: Problems with rspec, models and relationships in 2.0
You don''t need the location_id field in users and world_cities tables. locations has no id field. Nor is it needed. The user record may need to be saved before you can create a location relationship. It has no id until it is saved user = User.create(:name => "Fred Flintstone", :username => "fred") loc = randomCity() user.locations << loc user.save HTH, Jeffrey Quoting Col Wilson <col.wilson.email-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>:> > I have a couple of problems which are kinda related, so I''ll out them > both here. I''ve been trying out rspec for the first time and I''m new > to has_many :through relationships, so excuse me. > > I want to relate a User to a WorldCity through a Locations > relationship. > > > ############file:models/user.rb > class User < ActiveRecord::Base > has_many :locations > has_many :world_cities, :through => :locations > end > > ############file:models/world_city.rb > class WorldCity < ActiveRecord::Base > has_many :locations > has_many :users, :through => :locations > end > > ############schema.rb > ActiveRecord::Schema.define(:version => 3) do > > create_table "locations", :force => true do |t| > t.integer "user_id" > t.integer "world_city_id" > t.datetime "created_at" > t.datetime "updated_at" > end > > create_table "users", :force => true do |t| > t.string "username" > t.string "name" > t.integer "location_id" > t.datetime "created_at" > t.datetime "updated_at" > end > > create_table "world_cities", :force => true do |t| > t.string "name" > t.float "latitude" > t.float "longitude" > t.string "country" > t.string "region" > t.integer "location_id" > t.datetime "created_at" > t.datetime "updated_at" > end > > end > > > ###########user_spec.rb > describe User do > fixtures :world_cities > > before(:each) do > @user = User.create( :name => "Bob Harris", :username => > "bobharris" ) > end > > it "has a user with username ''bobharris''" do > User.find_by_username("bobharris").should be_valid > end > > it "has a user with username ''bobharris with a related WorldCity''" > do > #########???? > end > > end > > > ## Question ## > I want the model to be able to assign a random WorldCity to a new user > (not really important why here). Where should this be done and how do > I test it in rspec? I''m sure if I had an example I could understand > this, but can I change the user.rb to override the create method and > add a location; does the rails framework let me assign a WordCity to a > User and take care of the relationship (that would be nice). > > I''ve tried everything I can think of but can''t get my head around it. > > Please help. > > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Good catch Jeffrey. The location_id in both User and WorldCity is unnecessary. For the assignment, I''d work along these lines (untested): class User < ActiveRecord::Base has_many :locations has_many :world_cities, :through => :locations before_create :assign_random_city private def assign_random_city self.locations.create :world_city=>WorldCity.random end end On Mar 22, 10:18 am, "Jeffrey L. Taylor" <r...-f/t7CGFWhwGcvWdFBKKxig@public.gmane.org> wrote:> You don''t need the location_id field in users and world_cities tables. > locations has no id field. Nor is it needed. > > The user record may need to be saved before you can create a location > relationship. It has no id until it is saved > > user = User.create(:name => "Fred Flintstone", :username => "fred") > loc = randomCity() > user.locations << loc > user.save > > HTH, > Jeffrey > > Quoting Col Wilson <col.wilson.em...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>: > > > > > I have a couple of problems which are kinda related, so I''ll out them > > both here. I''ve been trying out rspec for the first time and I''m new > > to has_many :through relationships, so excuse me. > > > I want to relate a User to a WorldCity through a Locations > > relationship. > > > ############file:models/user.rb > > class User < ActiveRecord::Base > > has_many :locations > > has_many :world_cities, :through => :locations > > end > > > ############file:models/world_city.rb > > class WorldCity < ActiveRecord::Base > > has_many :locations > > has_many :users, :through => :locations > > end > > > ############schema.rb > > ActiveRecord::Schema.define(:version => 3) do > > > create_table "locations", :force => true do |t| > > t.integer "user_id" > > t.integer "world_city_id" > > t.datetime "created_at" > > t.datetime "updated_at" > > end > > > create_table "users", :force => true do |t| > > t.string "username" > > t.string "name" > > t.integer "location_id" > > t.datetime "created_at" > > t.datetime "updated_at" > > end > > > create_table "world_cities", :force => true do |t| > > t.string "name" > > t.float "latitude" > > t.float "longitude" > > t.string "country" > > t.string "region" > > t.integer "location_id" > > t.datetime "created_at" > > t.datetime "updated_at" > > end > > > end > > > ###########user_spec.rb > > describe User do > > fixtures :world_cities > > > before(:each) do > > @user = User.create( :name => "Bob Harris", :username => > > "bobharris" ) > > end > > > it "has a user with username ''bobharris''" do > > User.find_by_username("bobharris").should be_valid > > end > > > it "has a user with username ''bobharris with a related WorldCity''" > > do > > #########???? > > end > > > end > > > ## Question ## > > I want the model to be able to assign a random WorldCity to a new user > > (not really important why here). Where should this be done and how do > > I test it in rspec? I''m sure if I had an example I could understand > > this, but can I change the user.rb to override the create method and > > add a location; does the rails framework let me assign a WordCity to a > > User and take care of the relationship (that would be nice). > > > I''ve tried everything I can think of but can''t get my head around it. > > > Please help.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks all for you replies. On Mar 24, 3:00 pm, AndyV <a...-HmMyXyqgL2CVc3sceRu5cw@public.gmane.org> wrote:> Good catch Jeffrey. The location_id in both User and WorldCity is > unnecessary. > > For the assignment, I''d work along these lines (untested): > > class User < ActiveRecord::Base > has_many :locations > has_many :world_cities, :through => :locations > > before_create :assign_random_city > > private > def assign_random_city > self.locations.create :world_city=>WorldCity.random > end > end > > On Mar 22, 10:18 am, "Jeffrey L. Taylor" <r...-f/t7CGFWhwGcvWdFBKKxig@public.gmane.org> > wrote: > > > You don''t need the location_id field in users and world_cities tables. > > locations has no id field. Nor is it needed. > > > The user record may need to be saved before you can create a location > > relationship. It has no id until it is saved > > > user = User.create(:name => "Fred Flintstone", :username => "fred") > > loc = randomCity() > > user.locations << loc > > user.save > > > HTH, > > Jeffrey > > > QuotingColWilson<col.wilson.em...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org>: > > > > I have a couple of problems which are kinda related, so I''ll out them > > > both here. I''ve been trying out rspec for the first time and I''m new > > > to has_many :through relationships, so excuse me. > > > > I want to relate a User to a WorldCity through a Locations > > > relationship. > > > > ############file:models/user.rb > > > class User < ActiveRecord::Base > > > has_many :locations > > > has_many :world_cities, :through => :locations > > > end > > > > ############file:models/world_city.rb > > > class WorldCity < ActiveRecord::Base > > > has_many :locations > > > has_many :users, :through => :locations > > > end > > > > ############schema.rb > > > ActiveRecord::Schema.define(:version => 3) do > > > > create_table "locations", :force => true do |t| > > > t.integer "user_id" > > > t.integer "world_city_id" > > > t.datetime "created_at" > > > t.datetime "updated_at" > > > end > > > > create_table "users", :force => true do |t| > > > t.string "username" > > > t.string "name" > > > t.integer "location_id" > > > t.datetime "created_at" > > > t.datetime "updated_at" > > > end > > > > create_table "world_cities", :force => true do |t| > > > t.string "name" > > > t.float "latitude" > > > t.float "longitude" > > > t.string "country" > > > t.string "region" > > > t.integer "location_id" > > > t.datetime "created_at" > > > t.datetime "updated_at" > > > end > > > > end > > > > ###########user_spec.rb > > > describe User do > > > fixtures :world_cities > > > > before(:each) do > > > @user = User.create( :name => "Bob Harris", :username => > > > "bobharris" ) > > > end > > > > it "has a user with username ''bobharris''" do > > > User.find_by_username("bobharris").should be_valid > > > end > > > > it "has a user with username ''bobharris with a related WorldCity''" > > > do > > > #########???? > > > end > > > > end > > > > ## Question ## > > > I want the model to be able to assign a random WorldCity to a new user > > > (not really important why here). Where should this be done and how do > > > I test it in rspec? I''m sure if I had an example I could understand > > > this, but can I change the user.rb to override the create method and > > > add a location; does the rails framework let me assign a WordCity to a > > > User and take care of the relationship (that would be nice). > > > > I''ve tried everything I can think of but can''t get my head around it. > > > > Please help.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---