7
votes

Comment autobuild un objet PolyMorphe ActiveCord associé dans les rails 3

class RandomProduct < ActiveRecord::Base
  has_one :item_source, :as => :product, :autosave => true, :dependent => :destroy

  module AutoBuildItemSource
    def item_source
      super || build_item_source
    end
  end  
  include AutoBuildItemSource
end

0 commentaires

4 Réponses :


0
votes

Que diriez-vous de créer le item_source lorsque le fichier aléatoire est créé: xxx

Bien sûr, si vous devez passer des arguments spécifiques à La source d'article, vous pouvez faire quelque chose comme ceci, à la place: xxx


1 commentaires

J'ai fini par faire une création avant la validation (B / C, je dois m'assurer que cela crée la source d'élément au moment de la création du produit), mais la solution que vous avez proposée est fondamentalement la même chose. Merci de la valider.



10
votes

in rails 3, alias_method_chain code> (et alias_method code> et alias code>) fonctionne bien:

class User < ActiveRecord::Base
  has_one :profile, :inverse_of => :user
  delegate :website, :to => :profile, :allow_nil => true
  accepts_nested_attributes_for :profile
end

User.new.profile # => nil
User.new.website # => nil
u = User.new :profile_attributes => { :website => "http://example.com" }
u.profile # => #<Profile id: nil, user_id: nil, website: "http://example.com"...>


0 commentaires

0
votes

Non pas que vous avez vraiment besoin d'un bijou pour cela puisqu'il est si simple de faire vous-même, mais voici un gemme qui le rend encore plus facile à déclarer une construction automatique:

https://github.com/tylerrick/active_record_auto_build_associations


0 commentaires

3
votes

(rails 4, fyi)

Je préfère personnellement la configuration avec après_initialize xxx

Ceci fonctionne aussi bien parce que vous pouvez aussi automatiquement Utilisez des formulaires avec ce qui serait autrement une association vide (Haml parce qu'il est plus agréable): xxx

Si vous n'aviez pas l'item_source construit déjà, le champ Étiquette et texte t rendu du tout.


0 commentaires