2

すべてのユーザーを保持するために使用されるユーザー モデルがあります。私のアプリにはメンターと学生の 2 種類のユーザーがいますが、構造は同じです。

私はこのようなことをしたいです。

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)

Student と Mentor 用に別々のモデルを作成せずにこれを行う方法はありますか? 両者が同じフィールドを使用しているのを見る必要はないと思います。

4

2 に答える 2

5

わかりましたので、訂正させてください。これは不可能であり、ユートピアの世界であったとしても、またはこれに対する回避策を見つけたとしても、それは確かに正しくありません.

実際に探しているのは、継承(Rails の STI または単一テーブル継承) とポリモーフィズムの組み合わせです。

どうすればこれを正しい方法で実装できますか?

ユーザーモデルがあり、学生メンター両方ともユーザーであるため、両方がこのモデルを継承します。

class User < ActiveRecord::Base
end

class Student < User
end

class Mentor < User
end

それは何を意味しますか?User モデルは、オブジェクトの初期化方法に応じて、「Student」または「Mentor」を含むか、何も含まないフィールドを (他に何もしなくても) 保持することを意味します。

user = User.create()
student = Student.create()
mentor = Mentor.create()

これで、RequestはStudentまたはMentorのいずれかに属することができます。したがって、ここでは次のようにポリモーフィックな関連付けを設定できます。

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
于 2013-05-12T21:13:48.387 に答える
1

何が必要なのかよくわかりません。同じモデル構造で、1 人のユーザーが多くの学生のメンターになることができますか? 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 を呼び出すことができます。

于 2013-05-12T21:12:46.260 に答える