2011-10-25 5 views
1

* 編集: *最後の段落は、問題の設定を簡単に説明するために追加されました。データモデルは複雑ですが、問題のセットはそれを指示するようです。たぶん誰か他の人が良いアイデアを持っています!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によって暗殺された、ブラウン氏に奉仕する雇い主(プレイヤー)。プレイヤーは、異なるレベルの情報、および異なるレベルの正確さ(場合によっては虚偽の情報を含む)を有する複数のソースから同じイベントに関する複数の噂インスタンスを収集することができる。

上記のコードは、特定のイベントに関するすべての情報部分(噂インスタンス)のコンテナとして機能する情報の「トップレベル」を示しています。

答えて

0

私は、テストするための同様のシナリオを持つプロジェクトを持っていません。私の頭の上から離れて、関係のタグは累積されています。 2つのインクルードタグを含めることができます:

includes(:rumor_instances => :target).includes(:rumor_instances => :actor) 

他にもあるかもしれないと思います。あなたのデータモデルは畳み込まれたように壊れます。プレイヤーは、うわさによって噂のインスタンス(私が思うに、貧弱な名前だと思う)にまっすぐ行くことができるはずです。あなたがやっていることは、あなたのデータモデルに何か間違っているような複雑さです。いずれにせよ、これが助けてくれることを願う。

+0

私はこれを試したことがあります。結果はゼロになります。雇い主が俳優とターゲットの両方であるという噂イベントはありません。複雑なシミュレーションです - 私はそれを裸問題を説明する必要性。 – Stephen

関連する問題