Ruby on rails: la Création d'un modèle d'entrée avec un belongs_to association
Je suis en train d'ajouter une nouvelle entrée dans ma base de données pour un modèle doté d'un belongs_to relation. J'ai 2 modèles, des Emplois et des Clients.
Qu'il était assez facile de trouver de tutoriel sur la façon de configurer l'association entre ces deux (à l'aide de has_many et belongs_to), mais je n'arrive pas à trouver des exemples où l'association est réellement utilisée.
Dans mon code, je suis en train de créer un nouveau poste pour le premier client. Les travaux modèle a un attribut pour client_id, et je sais que je peux probablement juste de remplir manuellement l'attribut, mais il y a quelques rubis convention facilement accomplir cette.
Job.create(:client_id => 1, :subject => "Test", :description => "This is a test")
Je peux facilement le mettre dans mon code, mais j'ai envie de ruby a une meilleure façon de le faire. Ici est la façon dont mes modèles sont d'installation
class Job < ActiveRecord::Base
attr_accessible :actual_time, :assigned_at, :client_id, :completed_at, :estimated_time, :location, :responded_at, :runner_id, :status, :subject, :description
belongs_to :client
end
class Client < User
has_many :jobs
end
class User < ActiveRecord::Base
attr_accessible :name, :cell, :email, :pref
end
client = Client.new; Job.create(:client => client, :subject => "Test", :description => "This is a test")
OriginalL'auteur user2158382 | 2013-04-29
Vous devez vous connecter pour publier un commentaire.
Appelez simplement
create
sur lejobs
collection du client:Client.find(:first)
ouClient.first
le déclenchement d'une exception est généralement le comportement attendu depuis dans les rails
RecordNotFound
exceptions sont convertis en 404 demandes dans les exceptions de l'app.OriginalL'auteur alf
Vous pouvez passer de l'objet comme argument pour créer de l'emploi:
La
create
méthode déclenche une erreur si l'objet n'est pas valide pour enregistrer (si vous avez défini des validations comme obligatoire, nom, etc).client
est marqué commeattribute_accessible
cela fonctionne aussi, mais j'ai comme l'autre syntaxe mieux.
OriginalL'auteur MrYoshiji
Passer de l'objet lui-même comme un argument, au lieu de passer son ID. C'est, au lieu de passer
:client_id => 1
ou:client_id => client.id
, passer:client => client
.OriginalL'auteur Rory O'Kane
Vous pouvez utiliser
create_job
de cette façon:Lorsque vous déclarez une
belongs_to
association, la classe de déclaration automatiquement les gains cinq méthodes liées à l'association:Dans toutes ces méthodes, l'association est remplacé par le symbole passé comme premier argument à
belongs_to
.plus: http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference
OriginalL'auteur Meysam Salehi
Pour la création de nouvelles instances que vous pourriez utiliser usines. Pour cela, vous pouvez simplement utiliser FactoryGirl https://github.com/thoughtbot/factory_girl
Ainsi après que vous avez défini votre usine soewhat comme ceci:
FactoryGirl.définir le faire
usine d'emploi :ne
client FactoryGirl.créer (le client)
objet 'Test'
description "Ceci est un Test'
Vous pouvez ensuite appeler FactoryGirl.créer (d'emplois) pour générer un nouveau poste comme ça.
Vous pouvez aussi appeler FactoryGirl.construire(:travail, client: aClientYouInstantiatedBefore, sous réserve: 'AnotherTest') et également remplacer tous les autres attributs
Factores sont bons si vous voulez créer de nombreux objets, qui sont semblables d'une certaine manière.
vous pouvez utiliser des usines partout pas seulement dans les specs ou des tests
si vous êtes à l'aide de factory girl pour le développement vous le faites mal.
vous avez raison,
Factories are good if you want to create many objects, that are similar in a certain way
...c'est la conception de la définition du motif. Mais FactoryGirl, malgré son nom, est pour le test.Vous pouvez l'utiliser dans
group: development
, mais seulement pour la création des choses dans la console rapidement. Il ne devrait jamais être dans le gemfile de production du groupe, ou partie prenante dans n'importe quelle partie de vos modèles/controllers/points de vue.OriginalL'auteur MentholBonbon