読者です 読者をやめる 読者になる 読者になる

Ruby Hashに要素を追加する

新しくHashをつくる
hash = Hash.new("")hash = {}

要素を格納する
hash = { hoge: "item1" , hoo: "item2" }

要素を追加する
hash = { bar: "item3" } #これだと変数hashが上書きされてしまう
p hash #=> { :bar => “item3” }

なので要素を追加するときは
hash[:hoge] = "item1"
hash[:hoo] = "item2"
とする。
こうすれば
p hash #=> { :bar => “item3”, :hoge => “item1”, :hoo => “item2” }
となる。

Ruby 2.4.0

ターミナルで文字絵が重なって表示される

るびまを読みながら配列の利用方法を勉強していたら、ターミナルで"□"が重なって表示されてしまった。
Rubyist Magazine - Ruby ではじめるプログラミング 【第 2 回】

□が半角文字と認識されてしまうらしい。
ターミナルの設定を変更したら解決したのでそのときのメモ。

ターミナル > 環境設定 > プロファイル > 詳細
詳細の言語環境項目にある「Unicode 東アジアA(曖昧)の文字幅をW(広)にする」をチェックする。
これで全角表示されるようになった。

Mac OS 10.12.3
ターミナル version 2.7.1

Heroku Ruby version 確認 メモ

Heroku Topページ

Documentation

Reference

Dev Center

Writing a Dev Center Article

Languages

Heroku Ruby Support

Ruby version

現在の最新
Ruby 2.4.0 patchlevel 0
Ruby gems 2.6.8

Ruby sortメソッドでArgumentErrorになる

配列の中にnilがはいっているとsortしたときにエラーになる。

 

array = [3,1,nil,5,4]

p array.sort  #=>ArgumentError

array.delete(nil)  #=>[3,1,5,4]

p array.sort  #=>[1,3,4,5]

 

文字列の配列で空(" ")があるとき、sortすると" "は先頭にくる。

 

str = ["f","","e","c","a"]

p str.sort #=>["","a","c","e","f"]

str.delete("")

p str #=>["f","e","c","a"]

 

ruby 2.3.1

空の値をつかった条件分岐

指定したカラムの値が空のときは......、のような条件づけをするときの""(ダブルクォートのみ)とnilについて。

if column_name == ""

  ...

end

if colimn_name == nil

  ...

end

の違い。

 

insertするとき、カラムは指定して値にシングルクォートのみを入れたときは""でカラムを指定せず何も入力しなかったらnil

条件をつけたとき、前者は

['column_name'] == "" が trueで ['column_name'] == nil だと false。

後者は

['column_name'] == nil が trueで ['column_name'] == ""だとfalse になる。

 

create table addresses (

name  text,

address1 text,

address2 text

);

 

insert into addresses (name,address1) values

('Taro Yamada' , '1-2-3 ooo-cho');

ならaddress2はnilがtrue。

 

insert into addresses (name,address1,address2) values

('Ichiro Suzuki' , '4-5-6 ooo-cho' , ' ');

ならaddress2は""がtrue。

 

ruby 2.3.1

postgeSQL 9.6

 

 

データベースの重複データを削除

データベース内の重複したデータを削除して一覧表をつくった。

やりかた。

データベースの値を << メソッドで配列に格納してからuniqメソッドで重複した要素を削除。重複がなくなった配列からeachメソッドで1件ずつ出力した。

 

 --postgreSQL--

database名:stocklist

table名:stocklists

warehouse  stock1              stock2               stock3

倉庫1          りんご             バナナ               みかん

倉庫2          りんご               パイナップル     キウイ

倉庫3          ぶどう            メロン      みかん 

 

--ruby file--

require 'active_record'

ActiveRecord::Base.establish_connection(

    adapter: 'adaptername'

    host: ' '

    username: 'myname'

    password: ' '

    database: 'stocklist'

)

 

class Stocklist < ActiveRecord::Base

end

 

lists = Array.new

Stocklist.each do | stock |

    lists << stock['stock1'] << stock['stock2'] << stock['stock3']

end

 

lists.each { | list | puts list }

 

--出力見本--

りんご

バナナ

みかん

パイナップル

キウイ

ぶどう

メロン

 #重複なく出力成功

 

失敗例

ブロック内で出力をかけたら、各レコード毎に出力してしまい、3重に出力してしまった。

Stocklist.each do | stock |

    lists << stock['stock1'] << stock['stock2'] << stock['stock3']

    lists.each do | list |

        puts list

    end

end

 

--出力見本--

りんご #倉庫1の在庫

バナナ

みかん

りんご  #倉庫1 + 倉庫2の在庫

バナナ

みかん

パイナップル

キウイ

りんご  #倉庫1 + 倉庫2 + 倉庫3の在庫

バナナ

みかん

パイナップル

キウイ

ぶどう

メロン

#3重に出力されてしまう。

 

なので stock を格納するブロックが終わったあとに、あらためてeachメソッドで変数 listsの出力をするとうまくいく。

CSVデータからワード検索してみつからなかったらインフォメーションをだす

データの中から必要な情報をワード検索で選び出し、マッチするものがないときはインフォメーションをだすコードを、元のデータがデータベースに入っている場合とCSVファイルになっている場合の2パターン書いてみた。

 

データベースをつかう場合はactiverecordを利用した。

--  postgreSQL  --

id           name                price 

1         '愛媛産みかん'         100

2         '青森産りんご'         120

3         '和歌山産みかん'     110

4         '長野産りんご'         130

 

--  sample_database.rb  (Ruby 2.3.1)--

require 'active_record'

 

ActiveRecord::Base.establish_connection(

    adapter: 'postgresql',

    host:  '',

    username:  'user_name',

    password:  '',

    database:  'database_name'

)

 

class Sampledata < ActiveRecord::Base

end

 

keyword = "みかん"

datas = Sampledata.where( 'name like ?' , "%#{keyword}%" )

datas.each do | data |

    if data.size == 0

        puts "みつかりませんでした。"

    else

        puts "#{data['name']}の値段は#{data['price']}円です。"

    end

end

 

#=> 愛媛産みかんは100円です。

#=> 和歌山産みかんは110円です。

# keyword = "ぶどう"の場合は

#=> みつかりませんでした。

 

データベースは便利だけれどインストールが必要だったり、接続に手間がかかったりするので、カラム数やレコード数が少ない場合はCSVデータですませたい。

--  sample.csv  --

id , name , price 

1 , 愛媛産みかん , 100

2 , 青森産りんご , 120

3 , 和歌山産みかん , 110

4 , 長野産りんご , 130

 

--  sample_csv.rb  --

require 'csv'

 

datas = CSV.open("sample.csv" , "r")

keyword = "ぶどう"

count = 0

datas.each do | data |

    if /#{keyword}/ =~ data[1]

        puts "#{data[1]}の値段は#{data[2]}円です。"

        count += 1

    end

end

if count == 0

   puts "みつかりませんでした。"

end

datas.close

 

#=> みつかりませんでした。

# keyword = "みかん"の場合は 

#=> 愛媛産みかんは100円です。

#=> 和歌山産みかんは110円です。

 

もっとうまいことできそうな気はする。