à l'aide de has_many :through et construire
j'ai trois modèles, tous pour un has_many :la relation d'aide. Ils ressemblent à ceci:
class Company < ActiveRecord::Base
has_many :company_users, dependent: :destroy
has_many :users, through: :company_users
accepts_nested_attributes_for :company_users, :users
end
class CompanyUser < ActiveRecord::Base
self.table_name = :companies_users #this is because this was originally a habtm relationship
belongs_to :company
belongs_to :user
end
class User < ActiveRecord::Base
# this is a devise model, if that matters
has_many :company_users, dependent: :destroy
has_many :companies, through: :company_users
accepts_nested_attributes_for :company_users, :companies
end
cette charge très bien, et les jointures sont construits amende pour les requêtes. Cependant, chaque fois que je fais quelque chose comme
@company = Company.last
@user = @company.users.build(params[:user])
@user.save #=> true
@company.save #=> true
à la fois la User
enregistrement et la CompanyUser
les documents créés, mais le company_id
champ dans la CompanyUser
enregistrement est réglé sur NULL
INSERT INTO `companies_users` (`company_id`, `created_at`,`updated_at`, `user_id`)
VALUES (NULL, '2012-02-19 02:09:04', '2012-02-19 02:09:04', 18)
il fait la même chose quand vous @company.users << @user
Je suis sûr que je suis en train de faire quelque chose de stupide ici, je ne sais pas quoi.
OriginalL'auteur rm-rf | 2012-02-19
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser un has_many :through comme ça, vous devez le faire comme ceci:
Puis vous aurez l'association définie correctement.
mise à jour
Dans le cas du commentaire ci-dessous, comme vous avez déjà accepts_nested_attributes_for, vos paramètres devrait venir comme ceci:
Et vous auriez les utilisateurs ajoutés à des sociétés automatiquement pour vous.
complété la réponse ci-dessus.
Merci! c'était ce qui me manquait. Je n'ai même pas penser à faire la forme comme ça. appelé sur moi d'être stupide.
@company.users.create(params[:user])
fonctionne aussi (au moins dans les Rails 4). Pour une raison quelconque, le@user = @company.users.build(params[:user]); @user.save
ne pas définir l'association pour moi.OriginalL'auteur Maurício Linhares
Je soupçonne votre
params[:user]
paramètre, sinon votre code semble propre.We can use build method with 1..n and n..n associations too
, voir ici.Je vous suggère de d'abord assurez-vous que votre modèle associations fonctionne très bien, pour cela ouvrir la
console
et essayez ce qui suit,Maintenant, si les enregistrements sont sauvegardés fine, déboguer les paramètres que vous passez à la méthode build.
Heureux de débogage 🙂
OriginalL'auteur nkm
Si vous avez un
has_many :through
association et vous souhaitez enregistrer une association à l'aide debuild
vous pouvez accomplir cela en utilisant le:inverse_of
option sur la belongs_to association dans la Jointure ModèleVoici une modification de l'exemple de l'rails docs où les balises a un has_many :grâce à l'association avec des poteaux et le développeur est en tentant de sauver les étiquettes à travers la jointure modèle (PostTag) à l'aide de la
build
méthode:L'attente commune est que la dernière ligne doit sauver le "par" enregistrement dans la table de jointure (post_tags). Toutefois, cela ne fonctionne pas par défaut. Cela ne fonctionne que si l' :inverse_of est définie:
Donc pour la question ci-dessus, le réglage de l' :inverse_of option sur la
belongs_to :user
association dans la Jointure Modèle (CompanyUser) comme ceci:entraînera le code suivant correctement la création d'un enregistrement dans la table de jointure (company_users)
Source: ici & ici
S'il vous plaît ajouter quelques explications pour le code (pas à la section des commentaires, et non pas par le biais de liens), de sorte que d'autres puissent apprendre de lui
fait!
OriginalL'auteur Kareem Grant