2015-11-28 2 views
0

Я хочу обновить таблицу окончательного результата на основе таблицы оценки. Не могли бы вы рассказать мне, что не так с приведенным ниже кодом, и как вы, наконец, сохраните данные во второй таблице?Обновление второй таблицы на основе данных первой таблицы в рельсах

Evaluation.rb

class Evaluation < ActiveRecord::Base 
    belongs_to :developer 
    belongs_to :supervisor 
    after_save :eval_score_calculator 

    def eval_score_calculator 
    finalscore.score_calculator 
    end 
end 

Final_score.rb

class FinalScore < ActiveRecord::Base 
    belongs_to :developer 

    def score_calculator 
    @job_performance_avg = (:job_knowledge_score.to_s.to_f + :quality_score.to_s.to_f + :quantity_score.to_s.to_f)/3 
    @interpersonal_skills_avg = (:team_contribution_score.to_s.to_f + :seeks_to_improve_score.to_s.to_f + :accepts_responsibility_score.to_s.to_f + :interaction_with_others_score.to_s.to_f+ :integrity_and_trust_score.to_s.to_f)/5 
    @organization_skills_avg = (:organization_planning_score.to_s.to_f + :use_of_company_resources_score.to_s.to_f + :time_management_score.to_s.to_f)/3 
    @final_score = 0.5 * @job_performance_avg + 0.25 * @interpersonal_skills_avg + 0.25 * @organization_skills_avg 
    end 
end 
+0

Никакой связи между Оценкой и FinalScore. Что это за финал? – praaveen

+0

О, извините..Оценка has_one: finalscore –

+0

Как называется столбец FinalScore, который вы хотите обновить? – FabKremer

ответ

0

1) Если вы хотите обновить таблицу, нужно .save для того, чтобы сохранить изменения в базе данных. Итак, после того, как вы получите все вычисления, вы должны изменить нужные столбцы и затем сохранить их. (При условии, final_rating столбец из таблицы Finalscore)

class FinalScore < ActiveRecord::Base 
    #other belongs_to 
    belongs_to :evaluation 

    def score_calculator(param1, param2) 
    #your calculations... 

    #update the fields you want of this final score 
    self.onething = param1 
    self.anotherthing = param2 

    #and at the end save it 
    self.save 
    end 
end 

2) Внутри вашего класса оценки, вы должны сначала получить конечный объект оценки, связанный с этой оценкой, а затем вызвать score_calculator. (Если у вас есть идентификатор объекта finalscore, связанный с этой оценкой в ​​качестве столбца в таблице оценки и Finalscore как имя таблицы)

class Evaluation < ActiveRecord::Base 
    #belongs_to ... 
    after_save :eval_score_calculator 
    has_one :finalscore 

    def eval_score_calculator 

    #finds the finalscore object in the table of finalscores 
    Finalscore.find(finalscore_id).score_calculator(a ,b) 

    end 

end 

a и b являются полями из вашего evaluation объекта, который вы передаете score_calculator, чтобы рассчитать счет evalutaion, а затем сохранить его в таблице finalscore. У вас есть этот finalscore объект обновлен, а также связан с evaluation с полем finalscore_id Я предложил вам ниже.

Если вы не имеете finalscore_id в вашем evaluation таблице я предлагаю вам добавить его с миграцией, чтобы упростить использование и соблюдать отношения, объявленные с has_one и belongs_to для этого вы могли бы взглянуть наhttp://guides.rubyonrails.org/association_basics.html#the-has-one-association

3) Вы используете @ для каждой переменной, которую вы заявляете, мне просто интересно, почему. @myVar используется для передачи данных между контроллерами и представлениями. Чтобы определить переменные в вашей модели, вы можете просто ввести ее без @, так или иначе они не будут доступны в ваших представлениях.

+0

Спасибо. Это звучит хорошо. Дай мне попробовать. –

+0

Хорошо .. еще вопрос. Чтобы выполнить некоторые вычисления, метод score_calculator в модели FinalScore либо должен получить доступ к любому пользователю, введенному на экране Evaluations/new, либо получить доступ к пользовательским записям, опубликованным в таблице оценки, или eval_score_Calculator должен передать эти аргументы в score_calculator. Какой должен быть наилучший вариант и как его реализовать? –

+0

Хорошо. Позвольте мне посмотреть, не получил ли я ваш вопрос. Внутри модели «FinalScore» вы можете использовать любое из полей «FinalScore»; способ, которым вы его используете, - это экземпляр объекта FinalScore, так что экземпляр имеет значения в своих полях, а затем эти поля могут использоваться внутри любой 'def' в вашей модели. Если вы хотите передать аргументы в 'def score_calculator', вы просто добавляете' def score_calculator (myParam, secondParam) 'и используете эти параметры внутри этого' def', а когда вы вызываете его из 'def eval_score_calculator', дайте ему параметры, которые ему нужны, так: «Finalscore.find (finalscore_id) .score_calculator (param1, param2)' –

Смежные вопросы