论坛首页 编程语言技术论坛

controller中关联关系的操作

浏览 2141 次
精华帖 (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.存在交叉存取问题,仍可能会破坏数据库的完整性。

第三种方法:
采用第一种方法处理,另外在数据库层面加上外键约束。即可避免以上问题。
   发表时间: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 字段,因为这个信息可能应该在在其它条件下获得
0 请登录后投票
   发表时间:2009-10-31  
不好意思,没有说明白。
我说的只是简单地关联Reader与Book,与当前用户无关。目的是高效且不会破坏数据库的完整性。
1 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics