我有一个用户模型,用于保存所有用户。我的应用程序,导师和学生中的用户有两种类型,但它们具有相同的结构。
我想做这样的事情。
has_many :requests, :foreign_key => mentor? ? 'mentor_id' : 'student_id', :class_name => 'Request'
我有导师?模型中的方法,但它给我一个method_missing错误。我假设是因为它正在寻找dynamic_matchers.rb
这是它给出的错误
/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/dynamic_matchers.rb:55:in 'method_missing': undefined method 'mentor?' for #<Class:0x00000001b40630> (NoMethodError)
如果没有为学生和导师制作单独的模型,有没有办法解决这个问题?我觉得没必要看到他们都使用相同的字段。
答案 0 :(得分:5)
好的,让我纠正一下:这是不可能的,即使在乌托邦世界中,或者你找到了解决方法,它肯定是不正确。
你实际上在寻找的是继承(RTI中的STI或单表继承)和多态之间的混合。
您有用户模式,学生和导师两者用户所以他们都继承此模型的。
class User < ActiveRecord::Base
end
class Student < User
end
class Mentor < User
end
这意味着什么?嗯,这意味着用户模型保持(没有你做任何其他事情)字段类型将包含&#39;学生&#39;或者&#39;导师&#39;或者根据您初始化对象的方式不做任何事情:
user = User.create()
student = Student.create()
mentor = Mentor.create()
现在,您的请求可以属于学生,也可以属于导师。所以在这里你可以像这样设置一个多态关联:
class Student < User
has_many :requests, as: :owner
end
class Mentor < User
has_many :requests, as: :owner
end
class Request < ActiveRecord::Base
belongs_to :owner, polymorphic: true
end
现在你可以写:
student.requests
mentor.requests
request.owner
答案 1 :(得分:1)
我不太确定你需要什么。 相同的模型结构,一个用户可以成为许多学生的导师?一个学生可以有一个导师?那是吗?
如果是,那么自我加入呢?
class User < ActiveRecord::Base
has_many :students, :class_name => "User", :foreign_key => "mentor_id"
belongs_to :mentor, :class_name => "User"
end
通过这种方式,您可以致电student.mentor和mentor.students