* 編集: *最後の段落は、問題の設定を簡単に説明するために追加されました。データモデルは複雑ですが、問題のセットはそれを指示するようです。たぶん誰か他の人が良いアイデアを持っています!Ruby/Rails 3:ARのクエリで複数のネストされたインクルードを使用するにはどうすればよいですか?
私はRuby on Railsを学んでいたので、この問題を1ヶ月以上も抱えていましたが、まだ解決策を発見していません。私はRails 3.09、Ruby 1.9.2、PG SQL 8.0を使用しています。私は現在、gemの依存関係のためにRails 3.1にアップグレードすることができません。
私は、ゲーム内の雇用活動に関する噂を収集し、噂の内容をエンドユーザーに表示するゲームに関する複雑なデータモデルを持っています。ユーザーが雇用を選択すると、その雇用が噂の行動の俳優または目標のいずれかであるデータベース内のすべての噂を見ることができるはずです。ここで
は、問題のクエリです:
@rumorEvents = current_webuser.player.rumor_events.includes(:rumor_instances =>[:actor, :target]).where(
"(hirelings.id=? AND ((\"suspectedActor\"=hirelings.name) OR (\"suspectedTarget\"=hirelings.name)))",
session[:selectedHireling]).
paginate(:page => params[:page], :per_page => 1).order('"rumor_instances".updated_at DESC')
それは上記の現状では、このクエリは、セッションのすべての噂のイベントを返します[:selectedHireling]は俳優ですが、それがターゲットである噂イベントを返しませんが。私が変更した場合 には(:rumor_instances => [:actor、:target]) 〜 が含まれています(:rumor_instances => [:target]) は、ターゲットであるがアクターではないすべてのイベントを返します。
アクターとターゲットの両方の噂イベントをすべて返すにはどうすればよいですか?全てのRELモデルは基本的なもの、と知られている作業
class RumorEvent < ActiveRecord::Base
belongs_to :player
has_many :rumor_event_rumor_instance_rels, :dependent => :destroy
has_many :rumor_instances, :through => :rumor_event_rumor_instance_rels
suspectedActor :string(255)
suspectedTarget :string(255)
class RumorInstance < ActiveRecord::Base
belongs_to :player
belongs_to :game_event
has_one :rumor_actor_rel, :dependent => :destroy
has_one :actor, :through => :rumor_actor_rel, :source => :hireling
has_one :rumor_target_rel, :dependent => :destroy
has_one :target, :through => :rumor_target_rel, :source => :hireling
class Hireling < ActiveRecord::Base
# id :integer not null, primary key
# name :string(255)
:ここ
は、モデルの関連セクションです。ここに例があります:
# Table name: rumor_event_rumor_instance_rels
#
# id :integer not null, primary key
# rumor_event_id :integer
# rumor_instance_id :integer
# created_at :datetime
# updated_at :datetime
#
class RumorEventRumorInstanceRel < ActiveRecord::Base
belongs_to :rumor_event
belongs_to :rumor_instance
end
ゲームイベントに関する口頭の説明(デザイナーから)。
ゲームイベントが発生すると、100%の正確で完全な情報がその行為について保存され、3日間のゲームで利用可能になります。 Hirelings and Playersがイベントの場所に近い都市を訪れると、「誰かが暗殺された」から「ヴェネツィアの商人」までのイベント(噂のインスタンス)についての情報の一部を学ぶことができるようになり、Sir SellsalotはMalagantによって暗殺された、ブラウン氏に奉仕する雇い主(プレイヤー)。プレイヤーは、異なるレベルの情報、および異なるレベルの正確さ(場合によっては虚偽の情報を含む)を有する複数のソースから同じイベントに関する複数の噂インスタンスを収集することができる。
上記のコードは、特定のイベントに関するすべての情報部分(噂インスタンス)のコンテナとして機能する情報の「トップレベル」を示しています。
私はこれを試したことがあります。結果はゼロになります。雇い主が俳優とターゲットの両方であるという噂イベントはありません。複雑なシミュレーションです - 私はそれを裸問題を説明する必要性。 – Stephen