开发者

Declaring associations in Ruby on Rails

开发者 https://www.devze.com 2023-02-16 19:38 出处:网络
Hopefully I don\'t get flamed for this one too bad - I\'ve tried my very hardest to find an answer to no avail.

Hopefully I don't get flamed for this one too bad - I've tried my very hardest to find an answer to no avail.

I was wondering if someone could help me figure out how to properly declare associations in Ruby on Rails (3). At the moment, I have 3 models:

#room.rb
class Room < ActiveRecord::Base
  has_many :check_ins
end

#check_in.rb
class CheckIn < ActiveRecord::Base
  belongs_to :user
  belongs_to :room
end

#user.rb
class User < ActiveRecord::Base
  has_one :check_in
end

So far, I haven't done any migrations to add foreign_k开发者_如何转开发ey columns to any of my tables (does Rails do this for you?).

I'm confused about why the command CheckIn.first.user returns nil whereas the command User.first.check_in returns SQLite3::SQLException: no such column. The same happens with respect to CheckIn.first.room and Room.first.check_ins, respectively. What would I need to do in order to have User.first.check_in return the CheckIn object associated with the first user and Room.first.check_ins return the set of CheckIns associated with the first Room?

Any help would be GREATLY appreciated.

Charlie


How did you originally generate these models? Did you just make the model files, or did you use rails' model generator (which also generates a migration for you)?

#room.rb
class Room < ActiveRecord::Base
  has_many :check_ins
end

#check_in.rb
class CheckIn < ActiveRecord::Base
  belongs_to :user
  belongs_to :room
end

#user.rb
class User < ActiveRecord::Base
  has_one :check_in
  has_one :room, :through => :check_in
end

In db/migrations/34612525162_something_something.rb You need to make sure you have migrations that set these tables up for you. The easiest way for you to do it would be to run this command in a console, modify the commands to use the fields you want, the *_id fields are required for your associations to work:

rails generate model user name:string email:string otherfield:integer
rails generate model check_in user_id:integer room_id:integer
rails generate model room number:integer

Note that these will also generate model files for you, since you already have these 3 model files it'll ask you if you want to overwrite them, or skip the files. You can skip them and it should be just fine. If you already had the migrations for part of the data in these models then you can just add the user_id and room_id fields to the check_in model by running this generator instead:

rails generate migration AddIdsToCheckIn user_id:integer room_id:integer

For rails 2.3.x replace rails generate with script/generate. Next you can inspect your migration(s) by opening the files up in db/migrate.rb and modify them there if you need to. Finally, run the migrations:

rake db:migrate

And it should work out for you. Note that I added a has_one, :through => relationship to User - this is so that you can do @user.room without having to make 3 chains: @user.check_in.room


You need to add the migrations yourself (or if you aren't live, you can modify an existing migration). Basically, you need to give the belongs_to side of the relationship a foreign key.


There is absolutely no reason to get flamed don't worry :) It seems here that you are trying to do a one to many association, but you're actually doing a many to many one.

If a user has one check in, it means that he/she has one room. So, you could just have :

user has_one room room belongs to user

and room has a user_id.

Hope that helps :)

0

精彩评论

暂无评论...
验证码 换一张
取 消