私は、シーズン中にサッカーチームを追跡するためのアプリケーションを作成しています。しかし、私はデータベースの設計に固執しています。 1つのフィクスチャにホームチームとアウェイチームがあります。 home_teamとaway_teamの2つの外部キーを持つフィクスチャー・モデルを作成しましたが、正しく機能するように関連付けを取得できません。何か案は?各灯具はリーグに属します。複数のレベルでの関連付け
1
A
答えて
7
簡単な答えは次のとおりです。
class Fixture < ActiveRecord::Base
belongs_to :home_team, :class_name => "Team", :foreign_key => :home_team
belongs_to :away_team, :class_name => "Team", :foreign_key => :away_team
end
class Team < ActiveRecord::Base
has_many :fixtures
end
しかしTeam.fixturesが動作しませんので、これはあなたの場合は無意味です。
class Team < ActiveRecord::Base
has_many :home_fixtures, :class_name => "Fixtures", :foreign_key => :home_team
has_many :away_fixtures, :class_name => "Fixtures", :foreign_key => :away_team
end
は2つのコレクションを提供しますが、それらを集約することはルビーで起こる必要があります。これは厄介です。
class Team < ActiveRecord::Base
def fixtures(*args)
home_fixtures.all(*args) + away_fixtures.all(*args)
end
end
これには問題があります。並べ替えと制限がすべてまとめられています(heh、a pun、who know?)。
class Team < ActiveRecord::Base
has_many :fixtures, :finder_sql => 'SELECT * FROM fixtures where (home_team = #{id} or away_team = #{id})'
has_many :home_fixtures, :class_name => "Fixtures", :foreign_key => :home_team
has_many :away_fixtures, :class_name => "Fixtures", :foreign_key => :away_team
end
これは醜いですが、うまくいくかもしれません。 finder_sqlは必要な処理を行っているようです。
他のオプションはnamed_scopeを使用することです。それは非常に読み取り専用の協会のように動作します範囲だし、:finder_sql
を防ぐため
class Fixture < ActiveRecord::Base
named_scope :for_team_id, lambda{|team_id| {:conditions => ['(home_team = ? or away_team = ?)', team_id, team_id]} }
belongs_to :home_team, :class_name => "Team", :foreign_key => :home_team
belongs_to :away_team, :class_name => "Team", :foreign_key => :away_team
end
class Team < ActiveRecord::Base
def fixtures
Fixtures.for_team_id(id)
end
end
この最後の解決策は、私はに固執したいものです(実際にはどういう意味ですか?より多くの条件をマージする方法を知っていますか?サブクエリ、サブクエリを行うことがありますか?
これが役に立ちます。
0
Team
モデルとSomething
モデルがあるとします。後者はhome_team_id
とaway_team_id
となります。
class Something < ActiveRecord::Base
belongs_to :home_team, :class_name => 'Team'
belongs_to :away_team, :class_name => 'Team'
あなたはsomething.away_team
とsomething.home_team
としてそれらを参照します。
関連する問題
- 1. 複数レベルのネストされた関連付けショートカット
- 2. Rails:レコードとその複数レベルの関連付けを複製しますか?
- 3. モデル内の複数の関連付け
- 4. 複数のレベルのネストされたモデルの関連付けの問題
- 5. CakePHP複数モデルの関連付け
- 6. Swagger UI複数レベルのタグ付け
- 7. LINQ-To-SQLでの複数のオブジェクトの関連付けのモデリング
- 8. 複雑な複数の関連付けにスコープを書く -
- 9. 複雑なモデルの関連付け - レール
- 10. 複数の関連付けをレールで結合する
- 11. Cで複数のファイルを関連付ける方法
- 12. 音楽プレーヤーで複数のファイルを関連付ける方法#
- 13. has_many関連、複数の関連付けを1つの列に格納
- 14. Eager Laravelで複数の関連付けを一つの関連で条件付きでロードする
- 15. 複数の関連付けのためのHibernateクエリ
- 16. sqlalchemyの複数の/クラスの関連付け
- 17. 2つのモデル間の複数の関連付けを
- 18. 2つのモデル間の複数の関連付け - Rails 5
- 19. Railsの複数の関連付けの詳細検索
- 20. 2つのモデル間の複数の関連付け - Rails 3
- 21. 第2レベルと第3レベルの関連付けを含む問題
- 22. Rails:n個の関連レベルで複数のモデルフォームを作成
- 23. Rails - 同じモデルへの複数の関連付け
- 24. オープングラフのアクションを複数のオブジェクトと関連付ける&キャプションテンプレート
- 25. リストビューのMediaPlayerに関連付けられた複数のシークバー
- 26. グレー・ドメイン・モデルの関連付け複数フィールドのデフォルト・ソート
- 27. Rails 3.1 - belongs_to関連付けによる複数のオブジェクトのスコープ?
- 28. 複数のカスタムフィールド名とのRails関連付け?
- 29. 複数のテーブルからの関連付けを集計する
- 30. 既存の注釈を複数のエンティティに関連付ける