浏览 2141 次
锁定老帖子 主题:controller中关联关系的操作
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-10-29
最后修改:2009-10-29
class Reader < ActiveRecord::Base has_many :books end class Book < ActiveRecord::Base belongs_to :reader end 关联这两个模型的实例有几种方法 第一种方法: @book = Book.new(params[:book]) @book.save 新建book,直接将客户端传回的reader_id赋值给book的reader_id字段,保存book即可。 没有显式地调用关联方法,某种程度上相当于直接操作数据库,但达到了关联的效果。比较简单。 这样做有一个问题:没有对客户端传回的reader_id进行校验,可能会破坏数据库的完整性。 第二种方法 @book = Book.new(params[:book]) @book.reader = Reader.find(params[:reader_id]) @book.save 查询数据库,对客户端传回的reader_id进行了校验,显式地调用了关联方法。 这样做有两个问题(哈哈,还多了一个):1.多了一次数据库查询,性能下降;2.存在交叉存取问题,仍可能会破坏数据库的完整性。 第三种方法: 采用第一种方法处理,另外在数据库层面加上外键约束。即可避免以上问题。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-10-31
没有介绍背景,无从判断优劣,我猜更好的方式应该是这样的
# user.rb class User < ActiveRecord::Base has_one :reading end # reading.rb class Reading < ActiveRecord::Base has_many :books end # book.rb class Book < ActiveRecord::Base belongs_to :reading end # books_constroller.rb class BooksController < ApplicationController before_filter :current_user def create @current_user.reading.books << Book.new(params[:book]) ...... end end 这里并不放入 reader_id 字段,因为这个信息可能应该在在其它条件下获得 |
|
返回顶楼 | |
发表时间:2009-10-31
不好意思,没有说明白。
我说的只是简单地关联Reader与Book,与当前用户无关。目的是高效且不会破坏数据库的完整性。 |
|
返回顶楼 | |