1

我有模型用户和模型招聘人员。目前,这些是两个单独的表,但我想让它们成为一个。

当前的:

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

理想的:

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

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

4

4 回答 4

1

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

我还必须提到,默认情况下,rails 假定您的sti_column被调用type,但可以role轻松地被覆盖。

于 2013-05-08T17:46:24.133 回答
1

让我们承认你有你的 2 门课:

class User < ActiveRecord::Base
end

class Recruiter < User
end

Rails 将自动在users表中添加一个类型列,以便在您的控制器中,如果您执行以下操作:

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

Rails 将自动获取type = 'Recruiter'的记录,您甚至不必手动设置。如果你这样做:

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

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

于 2013-05-08T17:52:53.363 回答
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")

并且由于typeSTI 用户表中的属性(设置为“招聘人员”),该记录将用于招聘人员。

您可以将 STI 模型的特殊初始化放在模型的初始化器中,或者放在带有 if 级联检查类型的前置过滤器中。初始化程序可能更干净。

于 2013-05-08T17:53:38.953 回答
0

您是否尝试过 has_one 关联?

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one

于 2013-05-08T17:57:21.417 回答