2009-03-18 5 views
0

J'essaye de faire une forme complexe (comme le railscast) avec le travail répété-auto-complet (modifié par Pat Shaughnessy) pour créer des articles avec de nombreux auteurs (has-many: through). Je l'ai travaillé aussi longtemps que je veux toujours créer de nouveaux auteurs lorsque je sauvegarde un article. Comment puis-je créer mes notices auteur associées uniquement lorsqu'elles n'existent pas déjà et obtenir une mise à jour de la table des jointures pour quand?Rails et ActiveRecord: Enregistrer un objet parent lors de l'utilisation find-or-create sur has-many enfants

Je sais que vous pouvez utiliser find-or-create pour obtenir ce résultat avec l'objet parent, mais j'en ai besoin pour les objets associés qui sont sauvegardés lorsque @ article.save est appelé pour l'article.

dans articles.rb

before_save :remove_blank_authors 
after_update :save_authors 

def remove_blank_authors 
    authors.delete authors.select{ |author| author.fullname.blank?} 
    end 


def new_author_attributes=(author_attributes) 
    author_attributes.each do |attributes| 
     authors.build(attributes) 
    end 
    end 

def existing_author_attributes=(author_attributes) 
    authors.reject(&:new_record?).each do |author| 
     attributes = author_attributes[author.id.to_s] 
     if attributes 
     author.attributes = attributes 
     else 
     author.delete(author) 
     end 
    end 
    end 

    def save_authors 
    authors.each do |author| 
     author.save(false) 
    end 
    end 

et les auteurs de mon avis partiel:

<div class="author"> 
    <% fields_for_author author do |f| %> 

    <%= error_messages_for :author, :object => author %> 
    <%= f.label :fullname, "Author Fullname:" %> 
    <%= f.text_field_with_auto_complete :author, :fullname, {}, {:method => :get } %> 


    <%= link_to_function "remove", "$(this).up('.author').remove()" %> 

    <% end %> 
</div> 

J'utilise Rails 2.2.2.

Le problème est que je ne vois pas où je pourrais utiliser find-or-create. Au moment où les attributs des auteurs sont construits - new_author_attributes - je n'ai rien à chercher - c'est juste la pré-construction d'objets vides je pense - et au moment où les auteurs sont sauvés, ils sont déjà de nouveaux objets. Ou ai-je tort?

+0

A quoi ressemble votre vue et le code du modèle comme ? –

+0

Tout est juste un truc standard de plaque de chaudière comme l'exemple ici: http://patshaughnessy.net/2009/1/30/sample-app-for-auto-complete-on-a-complex-form – srboisvert

Répondre

2

Cela dépend de quelle version de Rails vous utilisez, mais vous devriez être en mesure de le faire:

@article.authors.find_or_create_by_article_id(@author) 

ou

@author.articles.find_or_create_by_author_id(@article) 

puis Rails « devrait » remplir les détails pour vous ..

Afin d'utiliser find_or_create vous devez avoir une condition pour l'évaluer par. Cette condition (la partie by_author_id) peut être modifiée en n'importe quelle colonne dans le modèle Article.

C'est l'une de la convention dispose que Rails comprend que je ne l'ai pas été en mesure de trouver des informations trop, donc si cela est loin, désolé;)

Questions connexes