Как добавить несколько столбцов в сиквеле - PullRequest
0 голосов
/ 04 ноября 2019

В этом примере:

require 'rubygems'
require 'sqlite3'
require 'sequel'

db = SQLite3::Database.new "fruits.db"
db2 = Sequel.sqlite("fruits.db")

db.execute 'CREATE TABLE "fruit" ("box_id" INTEGER, "apples" INTEGER, "oranges" INTEGER, "total" INTEGER)'

db.execute "INSERT INTO fruit(box_id,apples,oranges) VALUES(1,2,2)"

thisBox = db2[:fruit][:box_id => 1] 

Это работает в SQLite3:

db.execute "UPDATE fruit SET total = apples + oranges WHERE box_id=1"

Но я не могу придумать то же самое в одной строке в продолжении:

thisBox.update(:total => :apples + :oranges)

, который возвращает ошибку:

undefined method '+' for :unfollows:Symbol

Единственный путь, который я нашел, это:

apples = thisBox[:apples]
oranges = thisBox[:oranges]

thisBox.update(:total => apples + oranges)

1 Ответ

1 голос
/ 05 ноября 2019

Я настоятельно рекомендую прочитать чит-лист Sequel , README , а затем документацию для различных классов. Это чрезвычайно мощный и, на мой взгляд, отличный ORM.

Медитируйте на этом, как на отправную точку для того, чтобы научиться этому. Также будет показан простой, но не самый эффективный способ сделать то, о чем вы спрашиваете:

require 'sequel'

require 'logger'
DB = Sequel.sqlite(loggers: [Logger.new($stdout)])

DB.create_table :fruitbaskets do
  primary_key :id
  Integer :apple
  Integer :orange
  Integer :total
end

fruitbaskets = DB[:fruitbaskets]
fruitbaskets.insert(:apple => 1, :orange => 2, :total => 0)

fruit_basket = fruitbaskets.where(:id => 1)

fruit_basket.update(:total => fruit_basket.get([:apple, :orange]).sum) 

fruitbaskets.where(:id => 1).get([:apple, :orange, :total]) # => [1, 2, 3]
# >> I, [2019-11-04T19:30:20.524611 #8709]  INFO -- : (0.000188s) PRAGMA foreign_keys = 1
# >> I, [2019-11-04T19:30:20.524673 #8709]  INFO -- : (0.000013s) PRAGMA case_sensitive_like = 1
# >> I, [2019-11-04T19:30:20.525058 #8709]  INFO -- : (0.000228s) CREATE TABLE `fruitbaskets` (`id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, `apple` integer, `orange` integer, `total` integer)
# >> I, [2019-11-04T19:30:20.525212 #8709]  INFO -- : (0.000060s) SELECT sqlite_version()
# >> I, [2019-11-04T19:30:20.525331 #8709]  INFO -- : (0.000036s) INSERT INTO `fruitbaskets` (`apple`, `orange`, `total`) VALUES (1, 2, 0)
# >> I, [2019-11-04T19:30:20.525477 #8709]  INFO -- : (0.000040s) SELECT `apple`, `orange` FROM `fruitbaskets` WHERE (`id` = 1) LIMIT 1
# >> I, [2019-11-04T19:30:20.525558 #8709]  INFO -- : (0.000023s) UPDATE `fruitbaskets` SET `total` = 3 WHERE (`id` = 1)
# >> I, [2019-11-04T19:30:20.525669 #8709]  INFO -- : (0.000037s) SELECT `apple`, `orange`, `total` FROM `fruitbaskets` WHERE (`id` = 1) LIMIT 1

Примечание:

fruit_basket = fruitbaskets.where(:id => 1)

fruit_basket.update(:total => fruit_basket.get([:apple, :orange]).sum) 

Сиквел позволяет нам строить операторы постепенноесли это полезно для нашего кода. Я указываю на запись и затем могу использовать переменную разными способами. Это действительно мощно и описано в документации.

...