希望我不会因为这个问题而受到批评——我已经尽了最大努力寻找答案,但没有成功。
我想知道是否有人可以帮助我弄清楚如何在 Ruby on Rails 中正确声明关联 (3)。目前,我有 3 个模型:
#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
到目前为止,我还没有进行任何迁移来将foreign_key 列添加到我的任何表中(Rails 会为您执行此操作吗?)。
我很困惑为什么命令 CheckIn.first.user
返回 nil
而命令 User.first.check_in
返回 SQLite3::SQLException:没有这样的列
。 CheckIn.first.room
和 Room.first.check_ins
也分别发生同样的情况。我需要做什么才能让 User.first.check_in
返回与第一个用户关联的 CheckIn 对象,并 Room.first.check_ins
返回关联的 CheckIn 集与第一个房间?
任何帮助将不胜感激。
查理
最佳答案
您最初是如何生成这些模型的?您是刚刚制作了模型文件,还是使用了 Rails 的模型生成器(它还会为您生成迁移)?
#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
在 db/migrations/34612525162_something_something.rb 中,您需要确保您有为您设置这些表的迁移。最简单的方法是在控制台中运行此命令,修改命令以使用您想要的字段,*_id 字段是您的关联工作所必需的:
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
请注意,这些还会为您生成模型文件,因为您已经拥有这 3 个模型文件,它会询问您是否要覆盖它们,或跳过这些文件。你可以跳过它们,应该没问题。 如果您已经迁移了这些模型中的部分数据,那么您只需运行此生成器即可将 user_id 和 room_id 字段添加到 check_in 模型:
rails generate migration AddIdsToCheckIn user_id:integer room_id:integer
对于 Rails 2.3.x,请将 railsgenerate
替换为 script/generate
。接下来,您可以通过打开 db/migrate.rb 中的文件来检查您的迁移,并根据需要进行修改。最后,运行迁移:
rake db:migrate
它应该适合你。请注意,我向 User 添加了 has_one, :through =>
关系 - 这样您就可以执行 @user.room
而不必创建 3 个链: @user.check_in.room
关于ruby-on-rails - 在 Ruby on Rails 中声明关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276737/