2017-08-21 6 views
0

私のレールアプリケーションでは3つのテーブルがあります。会場、イベント、バンド。 これらは私のモデル別のテーブルを参照している新しいテーブルを作成するときに取得するIdが間違っています

class Venue < ApplicationRecord 
    has_many :events 
    has_many :bands, through: :events 
end 

class Event < ApplicationRecord 
    belongs_to :venue 
    belongs_to :band 
end 

class Band < ApplicationRecord 
    has_many :events 
end 

、私の移行です

を、私は私の関係がセットアップされているが、私は会場を参照する新しいイベントを作成するとき、それは私のshow.erbファイルに存在しない別の会場を探しますショーのための私のイベントコントローラでイベント

class CreateEvents < ActiveRecord::Migration[5.1] 
    def change 
    create_table :events do |t| 
     t.string :name 
     t.text :date 
     t.boolean :alcohol_served 
     t.string :image 
     t.belongs_to :venue, show:true 
     t.belongs_to :band, show:true 
     t.timestamps 
    end 
    end 
end 

のために私は

def show 
    @event = Event.find(params[:id]) 
    venue_id = Event.select(:venue_id).find(params[:id]) 
    @venue = Venue.find(params[:id]) 
end 
を持っています

この場合、イベントのページが表示され、会場が指定されています。私は3つの会場、3つのイベント、3つのバンドを持っています。主な問題は、私が4番目のイベントを作成するときに、私が指定した会場の代わりに4番目の会場を探すことです。

答えて

1

私はshow.erbファイルに存在しない、それは別の会場 を探す会場を参照する新しいイベントを作成

問題は、あなたのevents#show方法では、あなたがvenuesを取得する方法であります

@venue = Venue.find(params[:id]) 

@venue = Venue.find(params[:venue_id]) 
でなければなりません

params[:venue_id]が利用できない場合Pavanが指摘したように、あなたは、単純な

@venue = @event.venue 
+0

私はそれが正しい方向にあったかもしれないと思っていましたが、 "id ="エラーのある場所を見つけることができませんでした。 – dutchkillsg

+1

@dutchkillsgつまり、params [:venue_id]は 'nil'です。それをした '@venue = @ event.venue' – Pavan

+1

を試してみてください!ありがとう、ありがとう、私はそれに感謝します。かなり新しいレールになっていましたので、これは練習アプリケーションでした – dutchkillsg

2

を行うことができ、あなたの問題のベースは、あなたがEventsControllerparams[:id]で会場を探して、そのコントローラparams[:id]内されていることです@event.idを参照する必要があります。

また、あなたはあなたが捜している会場のIDを与えると、あなたが@venue = Venue.find(venue_id)を行うためにこれを使用することができます

venue_id = Event.select(:venue_id).find(params[:id]) 

を探していることを示しているが、それにはるかに慣用のRailsの方法がありますこれを実行してください:@venue = @event.venue

Venueアフィリエイトbelongs_to :eventのために、イベントでvenueメソッドが獲得されます。これはと同じ原理です。Eventhas_many :venuesです。

RailsのActiveRecordのは、[イベントを見つける方法を知っていて、あなたがSELECT venues.* FROM venues WHERE venues.event_id = $1のようにコンソールに表示することができますし、プレースホルダ$1が実際@venue.event_idによって置き換えられますいくつかのSQLを生成します。

+0

ですので、私は会場とバンドのマイグレーションに参考文献を載せることをお勧めしますか? IE:t.has_many:bands&t.has_many:events。これまでのところ、私はイベントの移行でこれらのタイプの参照のみを持っています – dutchkillsg

+0

あなたは現在、@ event.venue'、 '@ event.band'、' @ venue.events'、 '@ venue.bands' 、 '@ band.events'などです。 'Band.has_many:venues、through :: events'を追加する場合は、' @band.venues'も行うことができます。私はあなたが次に何をしようとしているのか分からないので、私はあなたのコメントには何も答えられません。オリジナルの質問に追加したいことがさらにある場合は、編集して追加してください。 – DRSE

関連する問題