【问题标题】:Single Table Inheritance in Rails 4Rails 4 中的单表继承
【发布时间】:2013-07-05 01:48:22
【问题描述】:

我正在尝试在 Rails 4 中实现一个稍微简单的 STI,但有些东西我还无法实现。

我有以下课程:

class Person < ActiveRecord::Base
end

class NaturalPerson < Person
end

class LegalPerson < Person
end

class Employee < NaturalPerson
end

class Customer < NaturalPerson
end

问题是,我有一些属性我只想从 Employee 类访问,有些只能从 Customer 等访问,但我找不到方法。如果我要使用 Rails 3 的方式,我会用 attr_accesible 解决它。但这现在是不可能的,因为我既没有使用 attr_accesible gem,也不愿意使用。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 sti


    【解决方案1】:

    我会在我的控制器中使用不同的 person_params,

    def person_params
    params.require(:person).permit(:email, :last_name, :first_name)
    end
    
    def natural_person_params
    params.require(:person).permit(:email, :job, :location)
    end
    

    并创建一个方法,我将在其中测试对象的类名或类型属性,因为它是 STI)以确定要使用的参数...

    希望对你有帮助

    干杯

    【讨论】:

    • 如果我想在控制器之外创建一个人怎么办?这也可能吗?我对 Rails 比较陌生,所以在这里我可能有一个概念上的错误。谢谢!
    • 再次阅读我的评论,我可能还不清楚。我的意思是,如果我想在控制器之外处理 NaturalPerson 的实例怎么办?如何定义仅适用于 NaturalPerson 的属性? ActiveRecord 处理 Person 属性的方式,Person 的所有子级都可以访问所有属性。谢谢!!!
    • 不确定,我还没有在 Rails 4 中测试 STI(只是快速阅读文档)。
    【解决方案2】:

    如果您尝试对所有模型使用单个控制器,则将所有属性放入白名单参数中。

    def person_params
      params.require(:person).permit(:email, :last_name, :first_name, :job, :location)
    end
    

    如果您想将它们分开,那么您需要为每种类型的人设置单独的参数:

    def person_params
      params.require(:person).permit(:email, :last_name, :first_name)
    end
    
    def employed_person_params
      params.require(:person).permit(:email, :job, :location)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多