У меня есть две модели
class Shoot < ActiveRecord::Base
has_many :questionnaires
end
class Questionnaire < ActiveRecord::Base
belongs_to :shoot
end
Модели Shoot и Анкеты имеют оба атрибута с именем positive_feedback .
Я пытаюсь обновить атрибут positive_feedbackв съемке, используя значение, взятое из positive_feedback Анкеты. Только одна анкета в побегах имеет положительную обратную связь со значением.Остальное будет содержать ноль или пустое строковое значение.Поэтому в моем запросе меня не беспокоит наличие более одного вопросника за один снимок со значением в атрибуте positive_feedback
Я пытаюсь получить лучший подход, чем мой текущий.
Я делаю что-то вроде этого, но меня это не устраивает:
selected_values = Shoot.joins(:questionnaires).where.not(questionnaires: {positive_feedback: ['', nil]}).select('questionnaires.positive_feedback AS feedback', 'shoots.id')
selected_values.each do |selected_values|
Shoot.find(selected_values.id).update_attribute(:positive_feedback, selected_values.feedback)
end
Я почти уверен, что есть лучший способ избежать цикла для каждого значения, которое я хочу обновить,но я не могу его найти.
Есть предложения?Большое спасибо.
Редактировать
Часть schema.rb , относящаяся к этому:
...
create_table "shoots", force: true do |t|
...
t.text "positive_feedback"
t.string "status"
t.datetime "created_at"
t.datetime "updated_at"
...
end
...
create_table "questionnaires", force: true do |t|
...
t.integer "shoot_id"
t.boolean "enabled", default: true
t.text "positive_feedback"
t.datetime "created_at"
t.datetime "updated_at"
...
end
add_index "questionnaires", ["shoot_id"], name: "index_questionnaires_on_shoot_id", using: :btree
Надеюсь этопомогает Прометей
Редактировать II
Спасибо, Макс, и извините, отношения между этими моделями немного шире, чем я показываю.Пытаясь уменьшить сложность дела, я написал несколько ошибок в своем первом редактировании.ТБХ имеет много связей, но я пытаюсь уменьшить сложность понимания.Я исправил предположения.В любом случае, я пытаюсь получить лишь способ оптимизировать запрос ActiveRecord, который я написал в начале.