Ruby on Rails - сохранение и обновление атрибута в объединяемой таблице с параметром many => through - PullRequest
1 голос
/ 16 ноября 2010

Чтобы упростить вещи, у меня есть 3 таблицы:

лицо

has_many: способности, через =>: статистика

Способность

has_many: люди, через =>: статистика

Статистика

принадлежит_: люди

принадлежит_ к способностям

Статистика имеет дополнительный атрибут под названием «рейтинг».

То, что я хотел бы сделать, - это создать форму редактора, которая всегда перечисляет все способности, имеющиеся в настоящее время в базе данных, и позволяет мне назначать каждому оценку.

Ради жизни я не могу понять, как это сделать. Мне удалось заставить его работать при создании нового пользователя с чем-то вроде этого:

(от контроллера людей)

def new
 @character = Character.new
    @abilities = Ability.all
    @abilities.each do |ability|
        @person.stats.build(:ability_id => ability.id )
    end
end

From the people form:

<% for @ability in @abilities do %>
    <%= fields_for "person[stats_attributes]" do |t| %>
 <div class="field">
    <%= t.label @ability.name %>
    <%= t.hidden_field :ability_id, :value => @ability.id, :index => nil %>
    <%= t.text_field :rating, :index => nil %>
  </div>
  <% end %>
  <% end %>

Это успешно дает мне список способностей с полями оценок рядом с ними и позволяет мне сохранять их, если я создаю нового пользователя.

Проблема в том, что если я затем загружаю форму редактирования (используя ту же часть формы), она не возвращает оценки, а если я сохраняю, даже с точно такими же оценками, она создает дублирующиеся записи в Таблица статистики, вместо того, чтобы обновлять ее.

Я понимаю, что я ужасный программист, и, вероятно, я делаю это неправильно, но как мне получить форму редактирования, чтобы вызвать текущие оценки, присвоенные каждой способности для этого пользователя, и, во-вторых, как мне ее получить? обновить рейтинг вместо дублирования, если комбинация личности и способности уже существует?

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Разве это не должно быть

Character
has_many :stats
has_many :abilities, through => :stats

Ability
has_many :stats
has_many :characters, through => :stats

Stat
belongs_to :character
belongs_to :ability

Кроме того, это Персона или Персонаж? Вы по-разному относитесь к обоим. (Я собираюсь пойти с характером в моем ответе)

Я думаю, что вы ошиблись "Я постараюсь сделать упрощенную версию моей схемы, чтобы попытаться проиллюстрировать проблему, но вместо этого усложнить ситуацию и запутать проблему, облажав ее, чтобы Смысл "синдрома". Во всяком случае, есть несколько проблем, которые я вижу:

1) во-первых, вы добавляете все возможные способности персонажу, как только они созданы. Это глупо - они должны начинаться без способностей по умолчанию, а затем вы создаете записи таблицы соединений (статистику) для тех, которые они делают имеют (отметив флажки в форме).

2) Простой способ манипулировать записями о соединении, подобный этому, заключается в использовании метода «ability_ids = », который дает вам макрос has_many: abilities - в api * называемом« collection_ids = »- 1014 *http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=M001885&name=has_many

Другими словами, если вы скажете

@character.ability_ids = [1,12,30]

, тогда это сделает объединения между этим персонажем и способностями 1, 12 и 30 и удалит любые другие объединения между этим персонажем и способностями , а не в приведенном выше списке. Добавьте к этому тот факт, что имена полей формы, оканчивающиеся на [], помещают свои значения в массив, и вы можете делать следующее:

#controller
def new
 @character = Character.new
 @abilities = Ability.all
end

#form
<% @abilities.each do |ability| %>
  <div class="field">
    <%= t.label @ability.name %>
    <%= check_box_tag "character[ability_ids][]" %>
  </div>
<% end %>

#subsequent controller (create action)
@character = Character.new(params[:character]) #totally standard code

Обратите внимание, что здесь вообще нет упоминаний о статистике. Мы указываем нужные нам связи между персонажами и способностями и позволяем рельсам обрабатывать объединения.

0 голосов
/ 16 ноября 2010

эпизоды Railscasts 196 и 197 показывают, как редактировать несколько моделей в одной форме.Показанный пример выглядит примерно так, как вы пытаетесь сделать, поэтому он может вам помочь (те же эпизоды на аскастах: 196 , 197 ).

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