0

2つのテーブル間の関連付けを作成しようとしています。学生用テーブルとコンピュータテーブル。コンピューターは(一度に)1人の学生にのみ割り当てることができますが、学生は複数のコンピューターに割り当てることができます。

これが私が現在考えていることです。関係を介して持っている多くを設定し、それを少し変更します。

class Student < ActiveRecord::Base
  has_many :assignemnts
  has_many :computers, :through => :assignments
end

class Computer < ActiveRecord::Base
 has_one :assignment
 has_one :student, :through => :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :student
  belongs_to :computer
end

これは、この問題を処理するための最良の方法のように思われますか?または、ここの専門家にすぐにもっと良い音が聞こえます。ありがとう!

4

3 に答える 3

1

最初に、単純な1対多の関係で十分かどうかを判断する必要があります。

はいの場合、Assignment-classとtableを削除できるため、非常に簡単になります。

データベーステーブルの「computers」には、一意でないインデックスを持つstudent_id列が必要です。

モデルは次のようになります。

class Computer < ActiveRecord::Base
    belongs_to :student
end

class Student < ActiveRecord::Base
    has_many :computers, :dependent => :nullify
end

学生が削除されたときにコンピュータを削除したくないので、「依存無効化」しますが、代わりに無料としてマークします。

各コンピュータは1人の生徒にのみ割り当てることができますが、たとえば翌年には、別の生徒に再割り当てすることができます。

于 2012-05-29T16:05:58.153 に答える
0

has_and_belongs_to_manyメソッドを使用することもできます。あなたの場合は次のようになります。

class Student < ActiveRecord::Base
    has_many :assignemnts
    has_and_belongs_to_many :computers, :join_table => 'assignments',
end

class Computer < ActiveRecord::Base
    has_one :assignment
    has_and_belongs_to_many :student, :join_table => 'assignments',
end

または、割り当てテーブルの名前をcomputers_studentsに変更して、join_tableを削除することもできます

class Student < ActiveRecord::Base
    has_many :assignemnts
    has_and_belongs_to_many :computers
end

class Computer < ActiveRecord::Base
    has_one :assignment
    has_and_belongs_to_many :student
end
于 2012-05-29T13:26:56.440 に答える
0

によって提供されるように、実際にはあなたのアプローチは問題ありません@alexkv。それは質問よりも議論です。

追加のフィールドを格納するなど、他の目的でマッピングテーブルを使用する場合は、別の方法が最適です。結合モデルのテーブルにはhas_many :through主キーがあり、他のモデルと同じように属性を含めることができます。

api.rubyonrails.orgから:

多対多の関係を構築する方法を選択することは必ずしも簡単ではありません。リレーションシップモデルを独自のエンティティとして使用する必要がある場合は、has_many:throughを使用してください。レガシースキーマを操作する場合、またはリレーションシップ自体を直接操作することがない場合は、has_and_belongs_to_manyを使用します。

これを読んで、状況に応じてどのアプローチを選択するのがよいかを理解することをお勧めします。

于 2012-05-29T13:55:25.157 に答える