具有条件的单表继承

时间:2013-05-08 17:42:59

标签: ruby-on-rails ruby model sti

我有模型User和model Recruiter。目前,这是两个单独的表,但我想让它们成为一个。

电流:

  • 用户:id,用户名,密码,姓名
  • 招聘人员:id,user_id

理想:

  • 用户:id,用户名,密码,角色(招聘人员,管理员)

我了解STI的基础知识。我想知道的是,当我在 Recruiter控制器(继承自User)上执行方法时,如何确保我的所有方法都在调用只是招聘人员的用户?因此,根据...... SELECT * FROM users WHERE role = 'recruiter'查询所有内容。

4 个答案:

答案 0 :(得分:1)

这是rails为您提供的,开箱即用的东西。您不必手动查询特定类型的用户,只需查询正确的模型。

我还必须提一下,默认情况下,rails会假设您的 sti_column 被称为type,但可以轻松地重写为role

答案 1 :(得分:1)

让我们承认你有两个班级:

class User < ActiveRecord::Base
end

class Recruiter < User
end

Rails会在用户表格中自动添加类型列,以便在您的控制器中执行以下操作:

class RecruitersController < ApplicationController
  def index
    @recruiters = Recruiter.all
  end
end

Rails将使用 type ='Recruiter'自动获取记录,您甚至无需手动设置。如果你这样做:

Recruiter.new(name: 'John').save

将在数据库中创建一个新用户,类型字段设置为'招聘者'

答案 2 :(得分:1)

你会定义你的模型:

 class User < ActiveRecord::Base
   ...
 end

 class Recruiter < User
 ...
   def initialize
     # ... special initialization for recruiters / you could put it here
     super
   end
 ...
 end

并创建一个新的招聘人员,你会这样做:

 Recruiter.create(:name => "John Smith")

并且由于STI用户表中的type属性(设置为'招聘人员'),记录将由招聘人员完成。

您可以将STI模型的特殊初始化放在模型的初始化程序中,或者在if-cascade检查类型的过滤器中。 初始化程序可能更清晰。

答案 3 :(得分:0)