Come impostiamo parametri aggiuntivi in has_many attraverso le associazioni?has_many attraverso attributi aggiuntivi
Grazie. Neelesh
Come impostiamo parametri aggiuntivi in has_many attraverso le associazioni?has_many attraverso attributi aggiuntivi
Grazie. Neelesh
has_many :tags, :through => :post_tags, :conditions => ['tag.owner_id = ?' @owner.id]
Che dire quando si fanno i tag << new_tag? – Neelesh
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.
Sembra che funzionerebbe, ma c'è un modo più ordinato, vedere la mia risposta :) –
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.
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.
come quale parametro aggiuntivo? – s84
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
@Codeglot il modello di associazione stesso potrebbe potenzialmente avere attributi aggiuntivi oltre gli id dei due oggetti collegati. –