Ruby / Rails 3: Как использовать несколько вложенных включений в AR, где запрос? - PullRequest
1 голос
/ 25 октября 2011

* Редактировать: * Последний абзац добавлен, чтобы кратко описать набор проблем - модель данных сложна, но набор проблем, кажется, диктует ее. Может быть, у кого-то есть идея получше!

Я работаю над этой проблемой более месяца, так как изучаю Ruby on Rails, и мне еще предстоит найти решение. Я использую Rails 3.09, Ruby 1.9.2 и PG SQL 8.0. В настоящее время я не могу перейти на 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')

Как он стоит выше, этот запрос возвращает все слуховые события, где session [: selectedHireling] является актером, но не возвращает слуховые события, где он является целью. Если я изменю включает в себя (: rumor_instances => [: актер,: цель]) в включает в себя (: rumor_instances => [: target]) он вернет все события, где он является целью, но не актером.

Как я могу вернуть все слуховые события как для актера, так и для цели?

Вот соответствующие разделы моделей:

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)

Все модели rel являются базовыми и известны как рабочие. Вот пример:

# 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 и игроки посещают города, расположенные рядом с местом проведения мероприятия, они могут узнать частичные сведения о событии (случаи слухов), которые варьируются от «кто-то был убит» до «Торговец Венецией, сэр Селлсалот был убит Малагантом». Наемник, который служит (игрок) мистер Браун ". Игрок может собрать несколько экземпляров слухов об одном и том же событии из нескольких источников, каждый из которых имеет разные уровни информации и разные уровни точности (включая в некоторых случаях ложную информацию).

Приведенный выше код иллюстрирует «верхний уровень» информации, который действует как контейнер для всех информационных частичек (экземпляров слухов) о конкретном событии.

1 Ответ

0 голосов
/ 26 октября 2011

У меня нет проекта с похожим сценарием для тестирования.Тем не менее, в верхней части моей головы есть теги для отношения, которые накапливаются.Вы просто должны иметь возможность включать 2 тега include:

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

Я думаю, что может быть что-то еще.Ваша модель данных выглядит как запутанная.Мне кажется, что игрок должен быть в состоянии перейти прямо к инстансу слухов (который, я думаю, плохое название для того, что он, похоже, представляет) через слух.То, что вы делаете, достаточно сложно, и я «чувствую» что-то не так в вашей модели данных.В любом случае, надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...