Не могу получить Rails: опция автосохранения для работы на моделях - PullRequest
4 голосов
/ 16 января 2010

Это может быть что-то совершенно простое, но я не могу на всю жизнь заставить это работать.По некоторым причинам: автосохранение на самом деле не является автосохранением базовых моделей.

Вот моя схема:

    create_table :albums do |t| 
  t.string :title
  t.text :review

  t.timestamps
end 

create_table :songs do |t| 
  t.integer :album_id
  t.string :name
  t.integer :length
end 

create_table :cover_arts do |t| 
  t.integer :album_id
  t.integer :artist
end 

Вот мои модели:

class Album < ActiveRecord::Base
  has_many :songs, :autosave => true
  has_one :cover_art, :autosave => true
end

class CoverArt < ActiveRecord::Base
  belongs_to :album
end

class Song < ActiveRecord::Base
  belongs_to :album
end

Когда явыполните следующие действия в IRB для альбома с обложкой, которая уже находится в базе данных:

a = Album.find(1)
a.title = "New title"
a.cover_art.artist = "New Artist"
a.save

Обновляет запись альбома, но не запись CoverArt.Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 13 августа 2010

Когда это случилось со мной, я обнаружил, что плагин betternestedset перезаписывает метод обновления без использования alias_method_chain или чего-либо еще для поддержки существующей цепочки вызовов. Я заменил переписывание обновлений betternestedset и поместил на его место простой вызов attr_readonly (аналог существующего вызова attr_protected в этом плагине). Возможно, это кому-нибудь поможет где-то.

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

Согласно документам необходимо сохранить родительскую запись, а не просто установить новое значение, чтобы дочерние записи также сохранили.

post = Post.find(1)
post.title # => "The current global position of migrating ducks"
post.author.name # => "alloy"

post.title = "On the migration of ducks"
post.author.name = "Eloy Duran"

post.save
post.reload
post.title # => "On the migration of ducks"
post.author.name # => "Eloy Duran"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...