2桁の計算を行うプログラムについて
対話型のインターフェイスで二桁以上の整数を入力すると、十の位と一の位の数字をもとに、足し算、掛け算を行い、最後にそれぞれの結果を足し合わせて出力するプログラムをRubyで作成してください。という問題。
def sample(input) ten(input / 10)%10 one(input / 1)%10 return ten,one end puts "二桁の整数を入力してください" input=gets.to_i ten,one = sample(input) puts "足し算結果と掛け算結果の合計値は#{(ten+one)+(ten*one)}です"
ある整数を10で割りさらに10で割った余りが10の位、1で割りさらに10で割った余りが1の位になるという法則を利用して。 10の位と1の位を分けるメソッドを定義。 get.to_iで数字を入力して変数に代入する。変数は,(カンマ)で区切ると二つ定義できるようです。なのでtenに10の位、oneに1の位を代入している。それで計算する。という感じかなと思いました。
activehashについて
データベースに登録するまでもなく、途中で変更の可能性が低いものを'activehash'というgemでactiverecordのように扱うことができる。 使い方はまずactivehashのgemをインストールする。
gem 'activehash'
(bundleinstall)も忘れずに…
その後悩んだんですがどうもrails g modelでファイルを作るのではなくて、モデルファイルを自作するよう。 こんな感じ、
class Prefecture < ActiveHash::Base self.date = [ {id: 0, name: '選択してください'}, {id: 1, name: '北海道'},{id: 2,name:'青森県'},{id: 3,name: '岩手県'}, {id: 4, name: '宮城県'},{id: 5,name:'秋田県'},{id: 6,name: '山形県'}, {id: 7, name: '福島県'},{id: 8,name:'茨城県'},{id: 9,name: '栃木県'}, {id: 10,name: '群馬県'},{id: 11,name:'埼玉県'},{id:12,name: '千葉県'}, {id: 13,name: '東京都'},{id: 14,name:'神奈川県'},{id:15,name: '新潟県'}, {id: 16,name: '富山県'},{id: 17,name:'石川県'},{id:18, name:'福井県'}, {id: 19,name: '山梨県'},{id: 20,name:'長野県'},{id:21, name:'岐阜県'}, {id: 22,name: '静岡県'},{id: 23,name:'愛知県'},{id:24,name:'三重県'}, {id: 25,name: '滋賀県'},{id: 26,name:'京都府'},{id:27,name:'大阪府'}, {id: 28,name: '兵庫県'},{id: 29,name:'奈良県'},{id:30,name:'和歌山県'}, {id: 31,name: '鳥取県'},{id: 32,name:'島根県'},{id:33,name:'岡山県'}, {id: 34,name: '広島県'},{id: 38,name:'愛媛県'},{id:39,name:'高知県'}, {id: 40,name: '福岡県'},{id: 41,name:'佐賀県'},{id:42,name:'長崎'}, {id: 43,name: '熊本県'},{id: 44,name:'大分県'},{id:45,name:'宮崎県'}, {id: 46,name: '鹿児島県'},{id: 47,name: '沖縄県'},{id:48,name: '未定'} ] end
記述完了。 ActiveHash::Baseを継承しているのですが、こうすることでactiverecordメソッドが使えるようになる。(allとかfindとか) あとはアソシエーションを組むなりバリデーションを設定するなりする。 アソシエーションについてはbelongs_to_active_hashがメソッドが用意されているため、相手となる側、今回はuserモデルにつける。 activehash側はなにもしなくて良い。また、相手側モデルに
extend ActiveHash::Associations::ActiveRecordExtensions
を付けないとactivehashが読み込めないようだ。 最終的にはこうなるのかな
class Item < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to_active_hash :user end
Ruby 条件分岐 if,else問題
問題.1 平日でないまたは休日の場合は「True」と返信し、 休日ではない場合は「False」と条件分岐させるメソッドを作りましょう。
呼び出し方: sleep_in(weekday, vacation)
出力例: sleep_in(false, false) → True sleep_in(true, false) → False sleep_in(false, true) → True
def sleep_in(is_weekday,is_vacation) if (is_weekday!=true || is_vacation == true) puts 'true' else puts 'false' end
これはおそらくis_weekday、is_vacationを引数に渡して条件分岐でis_weekday!がtrueでなければまたは、is_vacationがtrueの場合はtrueを返して、休日出ない場合つまりelseの際はfalseを返すということかな。
MySQL テーブル削除の仕方。
今回はmigrationまわりでエラーが起きてしまったのでその解決方法をメモする。 テーブルの設定も終わりrails db:migrateをしようとすると下記のようなエラーが…
Mysql2::Error: Table 'items' already exists
どうもitemsテーブルがなぜか登録されてしまっているようだ。その為すでに存在しているというエラーが発生してしまった。 なのでとりあえずテーブルを削除するようにした。方法はこちら
ターミナルで以下のように入力する。
rails db
するとターミナル上MySQLが確認出来る。 以下のコマンドで現在のテーブル状況をチェック
show tables;
以下のように現在のテーブルを確認できる。
+---------------------------------------------+ | Tables_in_fleamarket_sample_78c_development | +---------------------------------------------+ | ar_internal_metadata | | categories | | items | | profiles | | schema_migrations | | sending_destinations | | users | +---------------------------------------------+
今回はitemsテーブルを削除したいので、以下のようにコマンド入力
drop table items;
これで削除OK。念のためshow tables;で確認すると…
+---------------------------------------------+ | Tables_in_fleamarket_sample_78c_development | +---------------------------------------------+ | ar_internal_metadata | | categories | | profiles | | schema_migrations | | sending_destinations | | users | +---------------------------------------------+
itemテーブルが消えていることが確認出来る。
一応この後migrateしたらパスしました。
部分テンプレートについて
= render partial :'message',collection:@messages
一覧表示したいインスタンス変数を部分テンプレートで呼び出すとき、collectionを使うと一度にすべてを呼び出すことができる。ちなみにイアンスタンス変数の単数形がファイル名とおなじであれば省略可能
= render @messages
each文でもかけるみたいだが処理が遅いのであまり推奨されない。