2017-12-02 42 views
0

私はキャンプのためのキャンパーを登録するレールアプリに取り組んでいます。最初にあなたの名前、電子メールなどを使ってサインアップします。あなたのプロフィールが作成されたら、あなたはキャンプに登録することができます。キャンプがまだ満員でない場合、あなたはすぐに登録されます。それが満杯の場合、あなたは待機リストに入れられます。今は4つのモデルがあります:キャンパー(名前、電子メールなど)、キャンプ(名前、場所など)、登録、およびウェイトリスト。 アイデアは、キャンピングカーが多くのキャンプに登録できるようにすることです。私のクラスは以下の通りです:Rails - 同じモデル上に複数の 'has_many through'関連がある

# camper.rb 
has_many :enrolled_in, :class_name => 'Camps', through: :enrollments, dependent: :destroy 
has_many :waitlisted_in, :class_name => 'Camps', through: :waitlists, dependent: :destroy 

# camp.rb 
has_many :enrolled_campers, :class_name => 'Camper', through: :enrollments 
has_many :waitlisted_campers, :class_name => 'Camper', through: :waitlists 

ビューからこれらのモデルにアクセスする際に問題があります。ここでshow.html.erbは、次のようになります。

<!-- Listing camps --> 
<h2>Camps</h2> 
<p> 
    <strong>Name:</strong> 
    <%= @camper.enrolled_in.name %> <!-- This is where I get the error --> 
</p> 

<!-- Adding camps --> 
<h2>Add a camp:</h2> 
<%= form_with(model: [@camper, @camper.enrolled_in.build ]) do |form| %> 
<p> 
    <%= form.label :name %><br> 
    <%= form.text_field :name %> 
</p> 
<p> 
    <%= form.submit %> 
</p> 
<% end %> 

しかし、私は次のエラー取得しています:

ActiveRecord::HasManyThroughSourceAssociationNotFoundError in Campers#show

Could not find the source association(s) "enrolled_in" or :enrolled_in in model Enrollment. Try 'has_many :enrolled_in, :through => :enrollments, :source => '. Is it one of camp or camper?

をそして、私は正直に間違って何が起こっているのかわかりません。私はデータベースとレールがかなり新しいので、簡単に手に入れてください。

答えて

0

HABTM関連の方向を見てください。

  1. これにより、コードがきれいになります。 after_addと::
  2. あなたは持っています(。同じ名前のhas_manyのコールバックとは異なり、でも直接外部キーの挿入)は、常にモデルの変更を追跡するafter_destroyアクションを

Soが

class Camper 
    has_and_belongs_to_many :waitlists, after_add: :check_camp_ready_to_start_as_example 
    has_and_belongs_to_many :enrolllists 
end 

class Waitlist 
    belongs_to :camp 
    has_and_belongs_to_many :campers 
end 

class Enrolllist 
    belongs_to :camp 
    has_and_belongs_to_many :campers 
end 

class Campl 
    has_many :enrolllists 
    has_many :waitlists 
end 

、このような移行を作成するために、どのように読むことができる、(テーブルの結合を作成する必要があります)here