2016-05-20 5 views
1

私にはgamespickemsという2つのモデルがあります。ここで2つのモデルのユニークな結果を表示

は、これらのモデルのための私のスキーマです:

create_table "games", force: :cascade do |t| 
    t.integer "week_id", limit: 4 
    t.integer "home_team_id", limit: 4 
    t.integer "away_team_id", limit: 4 
    t.integer "home_score", limit: 4 
    t.integer "away_score", limit: 4 
    t.datetime "created_at",    null: false 
    t.datetime "updated_at",    null: false 
    t.integer "season_id", limit: 4 
end 

create_table "pickems", force: :cascade do |t| 
    t.integer "user_id", limit: 4 
    t.integer "game_id", limit: 4 
    t.integer "winner_id", limit: 4 
    t.integer "score",  limit: 4 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
end 

ゲームモデル

class Game < ActiveRecord::Base 
    belongs_to :home_team, class_name: 'Team' 
    belongs_to :away_team, class_name: 'Team' 
    belongs_to :week 
    belongs_to :season 
end 

Pickemモデル:私の見解では

class Pickem < ActiveRecord::Base 
    has_one :user 
    has_one :game 
    has_one :winner, class_name: 'Team' 
end 

、私がしたいですha以外のすべてのゲームを表示するそれを参照しているPickemに関連付けられています。私はまた、すべてのPickemsと関連付けられているゲーム属性の下に表示したい。この情報を表示するには、コントローラから呼び出してモデルを追加する必要がありますか?すべての

答えて

1

あなたはゲームのモデルにこれを追加することで、ゲーム/ Pickemの関連付けを修正する必要があります。

has_one :pickem 

、これをPickemモデルに:

belongs_to :game 

このクエリは、すべてを取得します関連するPickemを持たないゲーム:

@games_without_pickems = Game.joins(:pickem).group("games.id").having("COUNT('pickems.id') = 0").order("games.id") 

変更テーブル参照

これはPickemsと関連するゲーム情報をすべて取得します、あなたのビューでは、このような@games_without_pickems@pickemsの両方の上に単にループ、

@pickems = Pickem.includes(:games).all 

を:それを行う必要があり

<table> 
    <th> 
     <td>Week</td> 
     <td>Home Team</td> 
     <td>Away Team</td> 
     <td>Home Score</td> 
     <td>Away Score</td> 
     <td>Season</td> 
    </th> 
<% @games_without_pickems.each do |game| %> 
    <tr> 
     <td><%= game.week.name %></td> 
     <td><%= game.home_team.name %></td> 
     <td><%= game.away_team.name %></td> 
     <td><%= game.home_score %></td> 
     <td><%= game.away_score %></td> 
     <td><%= game.season.name %></td> 
    </tr> 
<% end %> 
</table> 

<table> 
    <th> 
     <td>User</td> 
     <td>Winner</td> 
     <td>Score</td> 

     <td>Week</td> 
     <td>Home Team</td> 
     <td>Away Team</td> 
     <td>Home Score</td> 
     <td>Away Score</td> 
     <td>Season</td> 
    </th> 
<% @pickems.each do |pickem| %> 
    <tr> 
     <td><%= pickem.user.name %></td> 
     <td><%= pickem.winner.name %></td> 
     <td><%= pickem.score %></td> 

     <td><%= pickem.game.week.name %></td> 
     <td><%= pickem.game.home_team.name %></td> 
     <td><%= pickem.game.away_team.name %></td> 
     <td><%= pickem.game.home_score %></td> 
     <td><%= pickem.game.away_score %></td> 
     <td><%= pickem.game.season.name %></td> 
    </tr> 
<% end %> 
</table> 

を。

+0

「Pickem」という名前の関連付けがゲームで見つかりませんでした。おそらく間違っていたでしょうか? " '<%@ games_without_pickems.each do | game | %> 'が強調表示されます。 –

+0

私は '@games_without_pickems = Game.joins(:pickems)'と同じ結果を試しました。 –

+0

私は、ゲームモデルから 'belongs_to:pickem'が欠けていたという事実を逃しました。私はそれを私の答えの一番上に付け加えました。それはそれらの問題を解決するはずです。 –

1

まず、あなたは私がhas_one belongs_toのためだと思う

# in Pickem Model 
class Pickem < ActiveRecord::Base 
    ... 
    has_one :game 
    ... 
end 

# in `pickems` table 
t.integer "game_id", limit: 4 

を持っている、あなたは pickemsテーブルではなく games表に foreign_keyを配置する必要があり、それが意味を作り始めるだろう。 すなわち

create_table "games", force: :cascade do |t| 
    ... 
    t.integer "pickem_id", limit: 4 
    ... 
end 

class Game < ActiveRecord::Base 
    ... 
    belongs_to :pickem 
    ... 
end 

I want to display all Games that do not have a Pickem associated that is referencing it

Game.where(pickem_id: nil) 

1つの提案

もしCだからあなたGameモデル等PickemTeam、などの複数のモデルに属しているので、代わりにPolymorphic Associationを使用してください。

理由:gameレコードのいずれかがpickemに属する場合、他のフィールドは空になります。

関連する問題