2010-06-29 3 views
1

J'ai récemment rencontré un problème où les enregistrements ont été marqués comme étant en lecture seule. Vérification de la documentation que j'ai trouvé ceci: «enregistrements chargés avec des jointures avec attributs de ferroutage seront marqués comme lus seulement, car ils ne peuvent pas être sauvés »Pourquoi les enregistrements avec attributs piggy-back ne peuvent-ils pas être sauvegardés?

Pourquoi pas? Mon modèle ressemble à ceci:

class MailAccount 
    belongs_to :account, :class_name => "UserAccount" 
    named_scope :active, :joins => :account, 
     :conditions => "user_accounts.archived_at IS NULL" 
end 

Je ne vois pas pourquoi les modèles chargés récupérés avec cette portée nommée ne peuvent pas être sauvegardés. Des idées?

+1

La solution appartient à une réponse ci-dessous, avec une coche verte à côté d'elle. –

+0

Merci Ignacio d'avoir signalé cela. –

Répondre

2

Il s'est avéré que je devais ajouter :select => "mail_accounts.*" à la portée, sinon la requête stockerait des attributs de user_accounts dans l'objet MailAccount, ce qui l'a empêché d'être sauvegardé.

Ainsi, le bon code à utiliser est:

class MailAccount 
    belongs_to :account, :class_name => "UserAccount" 
    named_scope :active, :joins => :account, 
     :conditions => "user_accounts.archived_at IS NULL", 
     :select => "mail_accounts.*" 
end 
1

Lorsque vous utilisez un: rejoindre, le modèle ActiveRecord pour cet objet associé n'est pas instancié. Vous devriez utiliser: include à la place.

+0

Merci pour votre réponse, mais je l'utilise comme une portée de sélection pure et ne nécessite normalement pas la classe d'association autrement. Dans ce cas, cependant, il serait peut-être préférable d'utiliser votre solution pour des raisons d'efficacité. –

Questions connexes