Rails动态外键为has_many关系

时间:2013-05-12 20:51:02

标签: ruby-on-rails ruby activerecord model

我有一个用户模型,用于保存所有用户。我的应用程序,导师和学生中的用户有两种类型,但它们具有相同的结构。

我想做这样的事情。

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)

如果没有为学生和导师制作单独的模型,有没有办法解决这个问题?我觉得没必要看到他们都使用相同的字段。

2 个答案:

答案 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