2017-12-05 2 views
0

私は本当にレールの複数のテーブルからquerysを扱うことに固執しています。レールで照会されたレコードから特定のデータ単位を表示するにはどうすればよいですか?

def show 
    @user = User.find(params[:id]) 
    @entry = Entry.joins(:event, :user).where(users: { id: '2' }) 
    @event = Event.find(1) 
    end 

、これは私のモデル

class Entry < ApplicationRecord 
    belongs_to :user 
    belongs_to :event 

class User < ApplicationRecord 
    has_many :entries, dependent: :destroy 

class Event < ApplicationRecord 
    has_many :entries, dependent: :destroy 

クエリは、レールコンソールに喜んで実行され、レコードを返しますが、私はentry.courseのような特定のユニットにアクセスする方法がわからないです。これは私のコントローラである場合私の埋め込まれたルビー。私はページにログインしているユーザでassosiatedすべてのエントリの出力気にいらに似woulkページでを明確にするために

更新

eventNameのeventLocation EVENTDATEもちろんsiCard

スキーマ:

ActiveRecord::Schema.define(version: 20171204183458) do 

    # These are extensions that must be enabled in order to support this 
    database 
    enable_extension "plpgsql" 

create_table "entries", force: :cascade do |t| 
    t.string "course" 
    t.string "siCard" 
    t.bigint "user_id" 
    t.bigint "event_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.index ["event_id"], name: "index_entries_on_event_id" 
    t.index ["user_id", "created_at"], name: 
    "index_entries_on_user_id_and_created_at" 
    t.index ["user_id"], name: "index_entries_on_user_id" 
end 

create_table "events", force: :cascade do |t| 
t.string "eventName" 
t.string "location" 
t.date "eventDate" 
t.text "description" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.string "eventLink" 
t.string "eventCoordinates" 
t.index ["eventName"], name: "index_events_on_eventName", unique: true 
end 

create_table "users", force: :cascade do |t| 
    t.string "name" 
    t.string "email" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.string "password_digest" 
    t.string "firstName" 
    t.string "remember_digest" 
    t.boolean "admin" 
    t.index ["email"], name: "index_users_on_email", unique: true 
end 

add_foreign_key "entries", "events" 
add_foreign_key "entries", "users" 
end 
+1

'@ entry'という名前のものは、実際は1つのEntryオブジェクトではありません。エントリの集まりです。それに応じてコードを変更します。 –

+0

人々はあなたが達成しようとしていることについて多くのことを推測しているようです。結果に表示する内容を明確にしてください。 1人のユーザー、1つのイベント、1つ以上のエントリ?モデルとアソシエーションに ':course'を追加してください。 '@entry 'で推測できるのですが。もちろん、それはあなたのコードがより組織化されるように '@ course'をコントローラに追加するほうが良いでしょう。 – neongrau

+0

私は何を求めているのかを明確にしようとしました。 –

答えて

0

あなたは2つの方法あなたが特定のエントリの値のコースにアクセスできるエントリのループよりも

1)

@entries = Entry.includes(:user,:event).where(user: { id: (params[:id]) }) 

2)

@entries = User.includes(entries: :event).find(params[:id]).entries 

でそれを見つけることができます

@entries.each do |entry| 
    puts "#{entry.course}" 
    puts "#{entry.event&.name}" 
end 
+0

'includes'アソシエーションを使用すると、別々のクエリでロードされます。 –

+0

はい。私はそれを知っている。 – Vishal

+0

これは完全に機能しますが、エントリ内の外部キーからイベントテーブルの情報を取得することは可能です。 –

1

は、なぜあなたはjoinsと、このような複雑なクエリを使用していますか? Entry@userの場合は、@user.entriesを使用してください。 ActiveRecordは、それに対処する方法をhas_manyから知っています。

単純な例を投稿した場合は、idが外部キーである限り、.where(user_id: user.id)のようなエントリでエントリを検索してください。これであなたはそれを必要としませんjoin、あまりにも。

+0

私は彼が特定のイベントへのエントリーを望んでいると思います。 '@entry = @ user.entries.where(event_id:1).first' – neongrau

0

あなたはユーザーもののエントリにアクセスすることができ、あなたのモデルによると eager_load

def show 
    @user = User.eager_load(:entries => [:event]).where(users: {id: params[:id]}) 
end 

を使用して1つのクエリで封じ込めることができます。

@user.entries 

@user.entries.map{|entry| entry.course} 

また、イベント(エントリに属します)はエントリにアクセスできます。

@user.entries[1].event 

@user.entries.map{|entry| entry.event} 
+0

これは1つ以上のクエリです。実際にはコントローラー内の1つだけであり、MVCパターンをひどく破るビューから多くのものがトリガーされました。 – neongrau

+1

そうです。私はあまりにも早く話しました。回答が更新されました。 'eager_load'を使うと、1つのクエリを作ることができます。 –

+0

'ActiveRecord :: StatementInvalid:PG :: UndefinedTable:ERROR:テーブル" user "のFROM-clauseエントリがありません。エラーが発生しました。 –

関連する問題