我有模型用户和模型招聘人员。目前,这些是两个单独的表,但我想让它们成为一个。
当前的:
- 用户:id、用户名、密码、姓名
- 招聘人员:id,user_id
理想的:
- 用户:id、用户名、密码、角色(招聘人员、管理员)
我了解 STI 的基础知识。我想知道的是,当我在新的Recruiter 控制器(继承自 User)上执行方法时,我如何确保我的所有方法都在调用仅是招聘人员的用户?因此,查询沿线... SELECT * FROM users WHERE role = 'recruiter'一切。
我有模型用户和模型招聘人员。目前,这些是两个单独的表,但我想让它们成为一个。
当前的:
理想的:
我了解 STI 的基础知识。我想知道的是,当我在新的Recruiter 控制器(继承自 User)上执行方法时,我如何确保我的所有方法都在调用仅是招聘人员的用户?因此,查询沿线... SELECT * FROM users WHERE role = 'recruiter'一切。
这是 Rails 为您提供的开箱即用的服务。您不必手动查询特定类型的用户,只需查询正确的模型。
我还必须提到,默认情况下,rails 假定您的sti_column被调用type,但可以role轻松地被覆盖。
让我们承认你有你的 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'。
你会像这样定义你的模型:
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 级联检查类型的前置过滤器中。初始化程序可能更干净。
您是否尝试过 has_one 关联?
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one