Rails rails 怎样使用迁移设定一个表的外键

413472212 · 2012年04月11日 · 最后由 rei 回复于 2013年07月28日 · 7520 次阅读

我有一个表需要引用另一个表的字段当做外键,想问下要怎样做?只需要添加 belongs_to 跟 has_one 就行了吗?

#1 楼 @Rei 刚看了一下 belongs_to 的文档,里面有个:foreign_key 参数,如果在 UserInfo 模型类里这样写belongs_to :user, :foreign_key => "stuNo",是不是也会把 users 表的 stuNo 字段设置为 user_infos 表 stuNo 字段的外键?

#3 楼 @413472212 模型层的 belongs_to 只添加了模型层的关联方法,不会在数据库层加外键关联。不过在 Rails 社区习惯不依赖数据库而只做模型层关联。如果认为应用环境需要数据库层的关联校验,也可以加上数据库外键。

:foreign_key 参数只是用来设置关联字段和关联名称不一致时的情况。

#4 楼 @Rei 那是不是如果我两个表都有一个 stuNo 字段,就不用:foreign_key 参数了?还有添加了模型层的外键关联后,还需要做什么才能使外键起到作用?因为刚才在 user_infos 里添加新的项,stuNo 字段输入一个 users 表中没有的值都可以添加成功。

#5 楼 @413472212 你得先放下以数据库为中心的建模思路。ActiveRecord 有一套惯例,例如 User 和 Book 模型,对应 users 表和 books 表。

# 表结构
# users(id, ...)
# books(id, user_id, ...)

class User
  has_many :books
end

class Book
  belongs_to :user
end

# 使用场景
user = User.new
book = Book.new
user.books << book
user.save

这样来完成数据保存。Rails 是先考虑模型层的建模,然后再根据模型层来准备数据库结构。可以看到因为在代码里面都是使用已有的数据对象来设置关联的,不会直接往数据库插入关联键的值。

foreign_key 参数是指如果 books 变成了 (id, author_id, ...) 这样的结构,而需要用 author_id 和 User 模型建立关联,就需要用

class User
  has_many :books, :foreign_key => :author_id
end

class Book
  belongs_to :user, :class_name => 'User', :foreign_key => :author_id
end

更多资料参考官方引导 http://guides.rubyonrails.org/association_basics.html

#6 楼 @Rei 有点懂了,思考角度问题,谢谢啦。

8楼 已删除

#8 楼 @cavno 通不过具体指什么错误?

10楼 已删除
11楼 已删除
12楼 已删除

#12 楼 @cavno 6 楼示例只是改了外键名字,没有改关联名字,所以关联方法还是 user

ActiveRecord 关联的关联名、外键名、类名都是可以设置的,你的写法对了。

14楼 已删除

#14 楼 @cavno 不清楚这是什么情况,听上去不是一个好主意。

现在已经 Rails 4.0 了,别看 2 的资料了。

16楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册