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