-1

--更新: 私はもう少し読んでいて、外部キーを追加する必要があるようです - 誰かが私がこれを行う方法を教えてもらえますか? 作成した余分なフィールドを削除する必要がありますか?

--

Ruby on Rails は初めてで、いくつかの基本概念に問題があります。Michael Hartl の本を読み終えたばかりで、RailsApps の bootstrap-devise-cancan テンプレートを使用して、最初のアプリを開始しています。

User モデルと Event モデルがあります。ユーザーが多くのイベントを投稿したり、多くのイベントに参加したりできるようにしたいと考えています。フィールド events_attending と created_events を User テーブルに追加しました。Event テーブルには users_attending と user_created が含まれています。「イベントの作成」フォームが送信されると、user_created フィールドにイベントを投稿したユーザーが入力され、そのイベント ID が created_events の下の users テーブルに記録されるようにしようとしています。

Event モデルに以下を追加しました。

  belongs_to :user
  has_many :users

および User モデルに (ただし、ユーザーが複数のイベントに属することができることを考えると、これが正しいかどうかはわかりません。has_and_belongs_to_many を調べて、おそらくそれが進むべき道だと思いました..):

  has_many :events
  belongs_to :event 

目的の効果を実現するためにコントローラーに何を入れればよいかわかりません。これは、現在イベント コントローラーにあるものです。

  def create
    @event = Event.new(params[:event])

    respond_to do |format|
      if @event.save
        format.html { redirect_to @event, notice: 'Event was successfully created.' }
        format.json { render json: @event, status: :created, location: @event }
      else
        format.html { render action: "new" }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end

コントローラーに何を追加する必要がありますか?他に何が欠けていますか? さらにコードを見る必要がある場合はお知らせください。ありがとう!

4

1 に答える 1

0

この質問に対する答えは、Rails ガイドその他の場所にあります。モデル リレーションの基本を理解していないことは明らかで、もう少し読み進める必要があります。私はあなたを助けようとします:

Users has_many イベントは、ユーザーが作成したイベントの関係です。その関係は、イベント テーブルの user_id 列としてデータベースでモデル化されます。そのため、ユーザーがイベントを作成すると、そのユーザー ID がイベント レコードに user_id として保存されます。Rails は user.events などのヘルパー メソッドを提供して、ユーザーが作成したすべてのイベントを取得します。

もう 1 つの関係 (イベントに参加するユーザー) には、別のテーブルが必要です。その理由は、関係を調べることでわかります。上記のユーザーとイベントの間の関係は 1 対多の関係です。ユーザーは多くのイベントを作成できますが、各イベントは正確に 1 人のユーザーに属します。ここでの関係は多対多の関係であり、イベントには多くのユーザーがアクセスでき、各ユーザーは多くのイベントにアクセスできます。その情報を正規化された方法でリレーショナル データベースに格納する方法はありません。ユーザーまたはイベントの関係のどちら側を見ても、データは配列です...

これに対する解決策は、結合テーブル、つまり user_id と event_id のペアを持つテーブルです。Rails はこの種のリレーションも処理できます。これはhas_and_belongs_to_manyリレーションまたは略して habtm と呼ばれます。セットアップ方法と操作方法に関する情報を提供するグーグル。

別のメモを投げます: user.event_visits を呼び出すが event.visiting_users を呼び出さない場合のように、1 つの観点からのみリレーションを見たい場合は、ユーザー モデルの列を使用してスキップすることができます。結合テーブル。必要なのは、ユーザーがアクセスするすべてのイベントを取得するために使用できる event_idsのシリアル化された列です。この方法でデータを操作することは正規化されていません (そのため、DBA には嫌われています) が、ニーズによっては妥当な場合があります。あなたの側でもう少し作業が必要になります。

于 2013-01-28T08:58:35.197 に答える