Касаясь записи - PullRequest
       9

Касаясь записи

0 голосов
/ 11 июня 2018

Я запрашиваю кучу таблиц / моделей для создания списка tab_projects идентификаторов и использую эти идентификаторы, чтобы делать вещи с другими записями в других таблицах / моделях, но я хочу обновить проекты, на которые влияетзапрос.Это то, что у меня есть:

_account_type_list_member_id = RefAccountType.find_by_typename('List Member').id

# Select all projects more than one week old and associated accounts not classified as a list member
_records = TabProject
               .select('tab_projects.id as tab_project_id, tab_projects.name as project_name, tab_projects.tab_client_seat_id as client_seat_id, tab_clients.name as client_name, tab_accounts.screen_name')
               .where("tab_projects.updated_at < '#{1.week.ago}' and tab_client_project_accounts.ref_account_type_id != #{_account_type_list_member_id}")
               .joins('inner join tab_clients on tab_projects.tab_client_id = tab_clients.id')
               .joins('inner join tab_client_project_accounts on tab_projects.id = tab_client_project_accounts.tab_project_id')
               .joins('inner join tab_accounts on tab_client_project_accounts.tab_account_id = tab_accounts.id')

# loop through all records in recordset
_records.map do |_record| 
    # do some stuff
end

_records.touch

Когда я запускаю его, я получаю следующую ошибку:

'method_missing': undefined method 'touch' for #<TabProject::ActiveRecord_Relation:0x000000084b2a00> (NoMethodError)

Итак, мои вопросы:

  1. Как я могу touch updated_at для записей, возвращенных из запроса и сохраненных в _records?
  2. Есть ли способ, которым я могу touch все записи?Это должны быть записи, распределенные по tab_projects (исходная таблица / модель), tab_client_project_accounts (таблица присоединения) и tab_accounts (учетные записи, связанные с какими-либо заданными записями в tab_projects)?

1 Ответ

0 голосов
/ 11 июня 2018

Вы пытаетесь вызвать метод touch на ActiveRecord::Relation Proxy, в основном ActiveRecord::Relation это слой поверх массива, поэтому вам нужно будет вызвать его

_records.each(&:touch)

Touch будет простообновите updated_at до Time.current, чтобы вы могли реализовать это самостоятельно, используя очень производительный update_all, это сгенерирует оператор обновления базы данных, который работает с несколькими записями

_records.update_all(update_at: Time.current)

Вы можете вызвать update_all наActiveRecord::Collection Proxy, для всех доступных методов см. документы: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Polymorphic+Associations

...