Rails обновляет запись многие ко многим - PullRequest
0 голосов
/ 07 марта 2011

Я застреваю при попытке обновить существующую запись многие ко многим.

Модель проекта:

class Project < ActiveRecord::Base
    belongs_to :assignment
    belongs_to :programmer
end

Модель программатора:

class Programmer < ActiveRecord::Base
    has_many :projects
    has_many :assignments, :through => :projects
end

Модель назначения:

class Assignment < ActiveRecord::Base
    has_many :projects
    has_many :programmers, :through => :projects
end

поэтому у меня есть данные, связанные так:

p = Programmer.create(:name => "Mike")

p.assignments.create(:name => "homework4")

p.assignments[0] = Assignment.find_or_create_by_name("homework1")

p.save

так что, как видите, я пытаюсь обновить ассоциацию первого hw Майка до " homework1 ". Все домашние задания уже находятся в таблице заданий, поэтому просто найдите « homework1 » и назначьте его Майку. к сожалению, когда я набираю третью строку, ошибок нет, но она не обновляется. В памяти p.assignments == homework1, но в БД все так же (даже после p.save). Таблица присоединения проекта вообще не изменяется.

журналы mysql показывают, что эта команда генерируется всякий раз, когда я вхожу в 3-ю строку.

SELECT "assignments".* FROM "assignments" WHERE "assignments"."name" = 'homework1' LIMIT 1

Обновлений нет нигде .... что я делаю не так?

UPDATE

Итак, я обнаружил, что могу просто ссылаться на таблицу соединений для редактирования ссылок. Что-то вроде:

proj = p.projects.first

proj.assignment_id = 12
proj.save!

Ответы [ 2 ]

0 голосов
/ 07 марта 2011

Вы можете проверить эту замечательную статью, написанную Райаном Бейтсом, которая в основном может улучшить ваши знания о форме вложенных объектов. http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes. Надеюсь, это поможет!

0 голосов
/ 07 марта 2011

Если вы просто хотите ссылку на объект, то вам нужно отредактировать ваши скрипты миграции (db / migrate).Пример:

def self.up
  create_table :configurations do |t|
    t.string :name
    t.references :project  # This store just the id of the object.
    t.timestamps
  end
end

Не забудьте набрать:

rake db:migrate
...