如何在数据库中反映Ruby on Rails中新的belongs_to和has_many关系

Ken*_* I. 23 ruby ruby-on-rails ruby-on-rails-3

我是rails(通常是一个python人)的新手,并且刚刚尝试构建一个简单的任务管理器应用程序以获得乐趣.我正在使用Devise进行身份验证,并且我正在尝试与用户关联的单个Task对象.我在Task模型中添加了以下内容:

class Task < ActiveRecord::Base
    belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

我在Devise的用户模型中添加了以下内容:

class User < ActiveRecord::Base
   has_many :tasks

   <<normal Devise stuff>>
end
Run Code Online (Sandbox Code Playgroud)

每当我添加这些信息时,我就会运行:rake db:migrate.然后它给了我一个错误,当我尝试用它做任何事情时,user_id的数据库字段不存在.

我确信这是一件相当简单的事情.谢谢您的帮助.

Dav*_*ulc 39

belongs_to模型添加(或任何其他)关系仅告知活动记录模型是逻辑链接的.这使您可以访问类似的方法task.user.为了实现这一点,必须通过数据库字段链接实例.

这是您缺少的步骤:您需要创建一个迁移,该列将向Task表添加一个列,指示它属于哪个用户.

rails g migration AddUserIdToTasks user_id:integer
Run Code Online (Sandbox Code Playgroud)

注意AddUserIdToTasks可以是您想要的任何名称.没什么区别.然后db/migrations/add_user_to_tasks,您可以打开并查看其功能.通常self.up会修改数据库的方式,而self.down会反过来(因此,在这种情况下,删除used_id).

然后实际执行SQL命令以更改数据库表和模式,运行

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

  • 您应该能够在rails控制台中创建/链接模块实例,例如,task = Task.first; task.user = User.first; task.save (2认同)

idl*_*ers 5

您需要先生成迁移以添加外键:

rails g migration AddUserIdToTasks user_id:integer
Run Code Online (Sandbox Code Playgroud)

然后跑 db:migrate

如果您希望用户能够引用该关联user.dreams,则需要添加:class_name => 'Task'到User模型中的has_many行.