20.times do |n| fn = family_names[n % 4].split(":") gn = given_names[n % 5].split(":") end がわからない
以下に書き換えられる。(直感的)
二回回す
family_names = %w{ 佐藤:サトウ:sato 鈴木:スズキ:suzuki 高橋:タカハシ:takahashi 田中:タナカ:tanaka } given_names = %w{ 二郎:ジロウ:jiro 三郎:サブロウ:saburo 松子:マツコ:matsuko 竹子:タケコ:takeko 梅子:ウメコ:umeko 悦子:エツコ:etuko } 4.times do |n| 5.times do |m| fn = family_names[n].split(":") gn = given_names[m].split(":") puts fn[2] + " " + gn[2] end end
結果
sato jiro sato saburo sato matsuko sato takeko sato umeko suzuki jiro suzuki saburo suzuki matsuko suzuki takeko suzuki umeko takahashi jiro takahashi saburo takahashi matsuko takahashi takeko takahashi umeko tanaka jiro tanaka saburo tanaka matsuko tanaka takeko tanaka umeko
参考
Ruby
配列・ハッシュ等
sort
sort_by
はハッシュを配列にする
split
は配列にする
each_with_indexでインデックスと配列ができる
each記法
numbers =[3,1,2] results=[] numbers.each do |item| results.push(item*10) end puts results
map記法
numbers=[3,1,2] numbers.map do |item| item*10 end puts numbers
継承
@'で始まる変数はインスタンス変数であり、特定のオブジェクトに所属しています。インスタンス変数はそのクラスまたはサブクラスのメソッドから参照できます。初期化されていないインスタンス変数を参照した時の値はnilです。
オーバーライド
def initialize(name) @name = name end def initialize() super = ("任意の名前") end
module_functionとして宣言されたメソッドはクラスにincludeできない module_functionの定義に()はつけられない
module Greeting def say_hello() puts "hello world" end def say_morning() puts "good morning! world!" end module_function :say_hello end class Player include Greeting def introduce() puts "私は、勇者です" end end Greeting.say_hello() player = Player.new() player.introduce() player.say_morning()
例外処理
標準エラー出力 STDERR.puts / STDERR.print
puts 1 begin number = 0 answer = 100 / number puts answer rescue ZeroDivisionError => e puts "0では割り算できません" # puts e.message # p e.backtrace STDERR.puts e.backtrace ensure puts 2 end
破壊的メソッドがnilを返す場合
参考
p f = [1,3,2, "2", "3" ] p g = f.uniq {|n|n.to_s} p f.object_id p g.object_id # [1, 3, 2, "2", "3"] # [1, 3, 2] # 70291846447480 # 70291846447180 p d = [1,3,2, "2", "3" ] p e = d.uniq! {|n|n.to_s} p d.object_id p e.object_id p d # [1, 3, 2, "2", "3"] # [1, 3, 2] # 70291846471400 # 70291846471400 # [1, 3, 2,] # dの配列を破壊的に変更 p a = [1,3,2, "2", "3" ] p b = a.uniq p a.object_id p b.object_id # [1, 3, 2, "2", "3"] # [1, 3, 2, "2", "3"] # 70291846470860 # 70291846470660 p b = [1,1,3,2, "2", "3" ] p c = b.uniq! p b.object_id p c.object_id p b # [1, 1, 3, 2, "2", "3"] # [1, 3, 2, "2", "3"] # 70327296121140 # 70327296121140 # [1, 3, 2, "2", "3"] p a = [1,3,2, "2", "3" ] p b = a.uniq! p a.object_id p b.object_id # [1, 3, 2, "2", "3"] # nil 重複する要素がない戻り値 # 70291846470320 # 8 # [1, 3, 2, "2", "3"]
SQL
復習
order by
select 入金額, 出金額 from 家計簿 order by 入金額, 出金額
ソート
だと考える
group_by
group_byした列ごとに出す
whereとHaving の違い
whereはグループにする前に条件をつける。Havingはグループ後の適用。
join
単なるjoinとはinnerjoinのこと
[参考] qiita.com
JOIN
= INNER JOIN
SELECT 日付, 費目.名前 FROM 家計簿 JOIN 費目 ON 家計簿.費目ID = 費目.ID
LEFT JOIN
= LEFT OUTER JOIN
SELECT 日付, 費目.名前 FROM 家計簿 LEFT JOIN 費目 ON 家計簿.費目ID = 費目.ID
結果は変わらない。
RIGHT JOIN
= RIGHT OUTER JOIN
SELECT 日付, 費目.名前 FROM 家計簿 RIGHT JOIN 費目 ON 家計簿.費目ID = 費目.ID
form_with
form_withとhidden_field
app/views/users/_follow.html.erb
<%= form_with(model: current_user.active_relationships.build, local: true) do |f| %> <div><%= hidden_field_tag :followed_id, @user.id %></div> <%= f.submit "Follow", class: "btn btn-primary" %> <% end %>
app/views/users/_unfollow.html.erb
<%= form_with(model: current_user.active_relationships.find_by(followed_id: @user.id), html: { method: :delete }, local: true) do |f| %> <%= f.submit "Unfollow", class: "btn" %> <% end %>
app/controllers/relationships_controller.rb
class RelationshipsController < ApplicationController before_action :logged_in_user def create user = User.find(params[:followed_id]) current_user.follow(user) redirect_to user end def destroy user = Relationship.find(params[:id]).followed current_user.unfollow(user) redirect_to user end end
「form_for, form_with」では、コントローラーで作成したインスタンスがnewメソッドで新たに作成され、 何も情報を持っていなければ自動的にcreateアクションへ、editアクションなどで作成され、 すでに情報を持っている場合はupdateアクションへ自動的に振り分けてくれる?
followed_idをヘルパーから受け取る必要があるのでhidden_fieldを用いてコントローラで処理
直接的に入力してもらわない