2017-07-06 2 views
1

私は2つのモデル、1つはEmployerと呼ばれ、もう1つはStudentと呼ばれます。雇用主は学生プロフィールを見ることができます。どのように雇用主に好きな学生プロフィールを保存させることができますか?モデルから学生を救うには?

私は、雇用主が学生プロフィールを見て好きなときは、「保存」をクリックする必要があり、そのユーザープロフィールへのリンクが保存され、雇用者プロフィールに表示されることを意味します。だから、雇用主が自分のプロフィールページに行くと、「保存された生徒」と呼ばれるセクションがあり、生徒のプロフィールへのリンクがそこにあります。

私は、 "saved_profiles"という配列を雇用主モデルに追加して、 "保存"ボタンを学生プロファイルに追加すると考えていました。雇用者がクリックすると、現在見ているウェブアドレスがsaved_profiles配列に追加されます。ウェブアドレスでは、"www.mywebsite.com/students/jake-madison"のようになります。私はこれをどのように実装するかについては完全にはわかっていないが、これをどうやって実現するかについての助けは大いに評価されるだろう。

答えて

3

"employers"テーブルの配列は、 "非正規化"戦略と呼ばれます。 「正規化された」戦略では、そのセーブをレコードとして結合テーブルに格納する必要があります。非正規化されたソリューションは、最初はすばやく簡単です。後で頭痛を引き起こす可能性があります。それで、Railの魔法のhas many throughの関連付けを使って、正規化された解法について話しましょう。

レール

class Employer 
    has_many :employer_students 
    has_many :students, through: :employer_students 

class Student 

class EmployerStudent 
    belongs_to :student 
    belongs_to :employer 

データベース

table: students 
columns: id, name 

table: employers 
columns: id, name 

table: employer_students 
columns: employer_id, student_id 

雇用者が学生のプロフィールを "節約"、私たちはその学生にその雇用者を結ぶ、employer_studentsテーブルのレコードを作成します。次に、雇用者が救った学生を見たいときは、参加します。

employer.students 
+0

お返事ありがとうございます!どのような頭痛は、私たちが非正規化戦略を使用するときに話しているのですか? – LizzyTheLearner

+0

非正規化された戦略は基本的に結果をキャッシュしています。このような結果をキャッシュすると、クエリは(例えば、この配列内のidを持つ生徒を保存したすべての雇用主を返すなど)更新と同様に、手間がかかります(「保存」の削除を想像してください)。何十年ものデータベース最適化を活用することができないため、これらの操作はエラーが発生しやすく、スケーラビリティが大幅に低下します。データベースの代わりにアプリケーションメモリで行う必要があります。 – steel

+0

だから私はすでにidの2つのモデルを持っています。 1つは学生モデルであり、もう1つは雇用者モデルである。ですから、私はemployer_idとstudent_idでemployer_studentという別のモデルを作らなければなりませんか?それから私は何をすべきですか?あなたの答えは私がしなければならないことを説明していることを理解しています。それを更新して私のやり方を説明してください。ありがとうたくさん – LizzyTheLearner

関連する問題