Mise à jour de champ de jointure de table
-
19-09-2019 - |
Question
class Job < ActiveRecord::Base
has_many :employments, :dependent => :destroy
has_many :users, :through => :employments
class User < ActiveRecord::Base
has_many :employments
has_many :jobs, :through => :employments
class Employment < ActiveRecord::Base
belongs_to :job
belongs_to :user # Employment has an extra attribute of confirmed ( values are 1 or 0)
À mon avis, je suis en train de mettre à jour l'fié confirmées de 0 à 1 lorsque l'utilisateur cliquera.
<%= link_to "Confirm Job", :action => :confirmjob, :id => job.id %>
Dans mon contrôleur d'emploi je
def confirmjob
@job = Job.find(params[:id])
@job.employments.update_attributes(:confirmed, 1)
flash[:notice] = "Job Confirmed"
redirect_to :dashboard
end
Je suis sûr que tout cela est faux, mais il me semble être deviner quand il vient à has_many: par. Comment puis-je mettre à jour le champ confirmé dans une table jointe?
La solution
Je pense qu'un travail est affecté à un utilisateur par l'emploi. Ainsi, la mise à jour toutes les fonctions est pas une bonne idée, comme Joel suggère. Je recommande ceci:
class Employment
def self.confirm!(job)
employment = Employment.find(:first, :conditions => { :job_id => job.id } )
employment.update_attribute(:confirmed, true)
end
end
de votre contrôleur
@job = Job.find(params[:id])
Employment.confirm!(@job)
Cela implique qu'un emploi ne peut être prise par un utilisateur.
Autres conseils
Voici un coup de poignard à elle (non testé):
def confirmjob
@job = Job.find(params[:id])
@jobs.employments.each do |e|
e.update_attributes({:confirmed => 1})
end
flash[:notice] = "Job Confirmed"
redirect_to :dashboard
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow