Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 多态用户表设计模式活动记录_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 多态用户表设计模式活动记录

Ruby on rails 多态用户表设计模式活动记录,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我在rails应用程序中为用户建模 Student < User Parent < User Staff < User User i、 相反,我想将其拆分为多个表,一个包含所有用户的用户表,然后通过自然键连接到用户特定的表中。 计划使用自然连接 e、 g.DB看起来像 User -------- id name email type [Student|Parent|Staff] Student -------- id school year Parent -------

我在rails应用程序中为用户建模

Student < User
Parent < User
Staff < User
User
i、 相反,我想将其拆分为多个表,一个包含所有用户的用户表,然后通过自然键连接到用户特定的表中。 计划使用自然连接 e、 g.DB看起来像

User
--------
id
name
email
type [Student|Parent|Staff]

Student
--------
id
school
year

Parent
-------
title
work
那么,如何让活动记录自然地连接学生表和用户表呢

i、 我希望能做一些像这样的事情

class Student < ActiveRecord::Base  
end           
# would create an entry in Student and User tables.
Student.create(name:'john',school:'green high') 
# get via field in User table and puts out field in Student table
student = Student.where(email:'a@a.com') 
puts student.school
有点像


另外,如果这会对语法产生影响,我将升级到Rails 4。我想知道Rails 4和Rails 3在这方面是否有任何变化。

这只是猜测,但由于您没有收到太多反馈,让我详细说明我将如何做:

-

性病

我会将所有条目保存在一个表中,然后根据我使用Rails的经验扩展这些类

因此,我将保持您的原始设置保持干燥,并具有以下功能:

#app/models/user.rb
Class User < ActiveRecord::Base
   # fields:
   # id #primary key
   # name #common
   # email #common
   # type [Student|Parent|Staff]
   # school  # Student only
   # year    # Student only
   # title   # Parent only
   # work    # Parent only
end

#app/models/student.rb
Class Student < User
    remove_method "title"
    remove_method "title="

    remove_method "work"
    remove_method "work="
end

#app/models/parent.rb
Class Parent < User
    remove_method "school"
    remove_method "school="

    remove_method "year"
    remove_method "year="
end

#app/models/staff.rb
Class Staff < User
end
@student = Student.create(name: "x", school: "y")
当然,各种属性不会被填充,这导致我查找这个问题:


显然,您可以使用该方法隐藏不同模型中的各种属性。这将使您能够(尽管有点小技巧)只使用正确的数据填充模型

考虑组合而不是继承感谢Marian-这对我来说是新的!如果可以重写并引发有关继承结构的错误,为什么要删除?这在未来几年会变得更加清晰,一个简单的无方法错误将不会非常有用。当然,我不知道说实话。我没有做我上面概述的事情,只是想提出一个建议。你是对的,也许你可以用一个关于提出命名法错误例外的解释来进一步解释这个问题?
@student = Student.create(name: "x", school: "y")