【问题标题】:Single Table Inheritance with Conditions带条件的单表继承
【发布时间】:2013-05-08 17:42:58
【问题描述】:

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

当前:

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

理想:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby model sti


    【解决方案1】:

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

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

    【讨论】:

    • 尽管我很想讨厌 rails 是多么的明确,但像这样的东西让它变得超级邪恶。有一个绿色的复选标记!谢谢普内特!
    【解决方案2】:

    让我们承认你有 2 个类:

    class User < ActiveRecord::Base
    end
    
    class Recruiter < User
    end
    

    Rails 会自动在 users 表中添加 type 列,以便在您的控制器中,如果您执行以下操作:

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

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

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

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

    【讨论】:

      【解决方案3】:

      你可以像这样定义你的模型:

       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 级联检查类型的前置过滤器中。 初始化器可能更简洁。

      【讨论】:

      • Rails 太酷了,让我大吃一惊。这也有帮助——我希望我能奖励你一个新手。
      【解决方案4】:
      猜你喜欢
      • 2011-08-23
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2011-08-29
      • 2012-07-25
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多