ruby-on-rails - 在 Ruby on Rails 中声明关联

标签 ruby-on-rails activerecord associations

希望我不会因为这个问题而受到批评——我已经尽了最大努力寻找答案,但没有成功。

我想知道是否有人可以帮助我弄清楚如何在 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.roomRoom.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/

相关文章:

ruby-on-rails - Ruby on Rails 多个belongs_to 关联保存

ruby-on-rails - Sublimetext 2 和 rails html.erb if then else 问题

sql - 在将 select() 与 includes() 和 where() 结合使用时,使用 activerecord 检索虚拟属性

ruby-on-rails - rails : Update data via link_to (without view)

mysql - 如何显示 "parent"公司以及给定位置的设施数量?

php - 基于多个动态值的Where子句,CodeIgniter

ruby-on-rails - Rails has_one :through association

mysql - 如何获取与 Sequelize 生成的模型相关的数据?

ruby-on-rails - config.action_controller.asset_path_template -- 未定义的方法?

ruby-on-rails - 在我看来,我如何使用 ruby​​ on rails find 方法,或者这是不好的做法?