Rails Active Record: вызов метода сборки не должен сохраняться в базе данных перед вызовом метода сохранения - PullRequest
4 голосов
/ 10 ноября 2011

У меня есть простая модель пользователя

class User < ActiveRecord::Base
    has_one :user_profile
end

И простая модель user_profile

class UserProfile < ActiveRecord::Base
    belongs_to :user
end

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

class UserProfilesController < ApplicationController

def create
        @current_user = login_from_session
        @user_profile = current_user.build_user_profile(params[:user_profile])
       #@user_profile.save (even with this line commented out, it still save a new  db record)
        redirect_to new_user_profile_path

end

Anyyyyyy кто-нибудь есть идея, что происходит.

Определение этого метода говорит следующее, но это все еще экономит для меня

build_association(attributes = {})

    Returns a new object of the associated type that has been instantiated with attributes and linked to this object through a foreign key, but has not yet been saved.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_one

1 Ответ

8 голосов
/ 10 ноября 2011

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

ХотяЯ не сохранял объект user_profile напрямую, я заметил в своих журналах, что что-то обновляло last_activity_time модели пользователя (и модель user_profile) каждый раз, когда я отправлял форму (дата last_activity модели пользователя также обновлялась, когда вошедший в систему пользователь делал различныеи другие вещи - позже я понял, что это было установлено в конфигурации драгоценного камня Sorcery.

Per http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html AutosaveAssociation - это модуль, который заботится об автоматическом сохранении связанных записей при сохранении их родителя.В моем случае пользовательский режим является родительским, и сценарий, который они предоставляют ниже, отражает мой опыт.

class Post
  has_one :author, :autosave => true
end 

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"

Следующие решения разрешили мою проблему 1. Остановка Волшебства (настройка конфигурации) от обновления пользователей last_activity_time (длякаждое действие) или 2. Передача опции ': autosave => false', когда я устанавливаю связь в пользовательской модели следующим образом

class User < ActiveRecord::Base
    has_one :user_profile, :autosave => false
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...