Как эффективно поменять значения между двумя экземплярами одной таблицы - PullRequest
0 голосов
/ 28 июня 2018

У меня есть два Book экземпляра, в которых я хочу поменять sequence значения столбца между двумя books

## Original values
# book_1.sequence = 10  
# book_2.sequence = 15

book_id = [1,2]

book_1 = Book.find(book_id.first)
book_2 = Book.find(book_id.second)

book_1_sequence = book_1.sequence
book_2_sequence = book_2.sequence

book_1.update_attributes!(sequence: book_2_sequence)
book_2.update_attributes!(sequence: book_1_sequence)

После выполнения программы:

book_1.sequence = 15
book_2.sequence = 10

Это делает трюк, но это довольно просто, есть ли лучший способ сделать это? аккуратнее и эффективнее

Ответы [ 3 ]

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

Еще один способ сделать это:

# Original values
book_1.sequence
 => 10

book_2.sequence
 => 15

book_ids = [1,2]

# Fetch all the books in single query
book_1, book_2 = Book.find(book_ids)

book_1.sequence, book_2.sequence = book_2.sequence, book_1.sequence
[book_1, book_2].each(&:save!)
0 голосов
/ 28 июня 2018

Поменять местами в одной строке с ruby ​​

# Original values
# book_1.sequence = 10  
# book_2.sequence = 15

book_id = [1,2]

book_1, book_2 = Book.find(book_ids)

book_1.sequence, book_2.sequence = book_2.sequence, book_1.sequence
book_1.save; book_2.save

Еще короче ( не рекомендуется , поскольку это очень запутанно, определенно не аккуратно и не интуитивно понятно):

Book.find(book_ids).tap { |book_1, book_2| book_1.sequence, book_2.sequence = book_2.sequence, book_1.sequence }.map &:save

#tap возвращает блок self in, который отображается на book_1 и book_2, меняет значения последовательности и возвращает books в том же порядке, что save затем сохраняет его.

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

Можно уменьшить хотя бы одну строку кода:

book_1.sequence = 10  
book_2.sequence = 15

book_id = [1,2]

book_1, book_2 = Book.find(book_ids)

book_1_sequence = book_1.sequence

book_1.update_attributes!(sequence: book_2.sequence)
book_2.update_attributes!(sequence: book_1_sequence)

Обновлено с предложением Роберта ван Элка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...