2011-03-19 13 views
9

Come impostiamo parametri aggiuntivi in ​​has_many attraverso le associazioni?has_many attraverso attributi aggiuntivi

Grazie. Neelesh

+0

come quale parametro aggiuntivo? – s84

+1

Ho un post modello, un modello di join PostTag e un tag modello. Voglio specificare chi ha creato il tag associato per il post. – Neelesh

+0

@Codeglot il modello di associazione stesso potrebbe potenzialmente avere attributi aggiuntivi oltre gli id ​​dei due oggetti collegati. –

risposta

1
has_many :tags, :through => :post_tags, :conditions => ['tag.owner_id = ?' @owner.id] 
+3

Che dire quando si fanno i tag << new_tag? – Neelesh

0

Ha lo stesso problema qui. Non riesci a trovare alcun tutorial su come farlo funzionare al volo in Rails 3. Ma puoi ancora ottenere ciò che desideri attraverso il modello di join stesso.

p = Post.new(:title => 'Post', :body => 'Lorem ipsum ...') 
t = Tag.new(:title => 'Tag') 

p.tags << t 
p.save # saves post, tag and also add record to posttags table, but additional attribute is NULL now 
j = PostTag.find_by_post_id_and_tag_id(p,t) 
j.user_id = params[:user_id] 
j.save # this finally saves additional attribute 

Abbastanza brutto ma questo funziona da me.

+0

Sembra che funzionerebbe, ma c'è un modo più ordinato, vedere la mia risposta :) –

10

Questo post del blog ha la soluzione perfetta: http://www.tweetegy.com/2011/02/setting-join-table-attribute-has_many-through-association-in-rails-activerecord/

Tale soluzione è: creare il tuo ": attraverso il modello" manualmente, piuttosto che attraverso il modo automatizzato quando si accoda alla gamma del suo proprietario.

Utilizzando l'esempio da quel post del blog. Dove i modelli sono:

class Product < ActiveRecord::Base 
    has_many :collaborators 
    has_many :users, :through => :collaborators 
end 

class User < ActiveRecord::Base 
    has_many :collaborators 
    has_many :products, :through => :collaborators 
end 

class Collaborator < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :user 
end 

In precedenza si potrebbe essere andato: product.collaborators << current_user.

Tuttavia, per impostare il parametro aggiuntivo (in questo esempio is_admin), piuttosto che il modo automatico di aggiungendo alla matrice, è possibile farlo manualmente come:

product.save && product.collaborators.create(:user => current_user, :is_admin => true)

Questo approccio consente di imposta gli argomenti aggiuntivi al momento del salvataggio. NB. lo product.save è necessario se il modello non è ancora stato salvato, altrimenti può essere omesso.

1

Beh, ero in una situazione simile in cui volevo avere un tavolo join che si è unito a 3 modelli. Ma volevo che il terzo modello ID fosse ottenuto dal secondo modello.

class Ingredient < ActiveRecord::Base 

end 

class Person < ActiveRecord::Base 
    has_many :food 
    has_many :ingredients_food_person 
    has_many :ingredients, through: :ingredients_food_person 
end 

class Food 
    belongs_to :person 
    has_many :ingredient_food_person 
    has_many :ingredients, through: :ingredients_food_person 

    before_save do 
    ingredients_food_person.each { |ifp| ifp.person_id = person_id } 
    end 
end 

class IngredientFoodPerson < ActiveRecord::Base 
    belongs_to :ingredient 
    belongs_to :food 
    belongs_to :person 
end 

E sorprendentemente, si può fare qualcosa di simile:

food = Food.new ingredients: [Ingredient.new, Ingredient.new] 
food.ingredients_food_person.size # => 2 
food.save 

In un primo momento ho pensato che prima ho salvato, non avrei accesso a #ingredients_food_person dopo l'assegnazione #ingredients. Ma genera automaticamente i modelli.

Problemi correlati