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

参考

teratail.com

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()

例外処理

f:id:shiness:20210208231931p:plain

標準エラー出力 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を返す場合

参考

gogutan.hatenablog.com


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

qiita.com

f:id:shiness:20210121181631p:plainf:id:shiness:20210121181714p:plain

JOIN = INNER JOIN

SELECT 日付, 費目.名前
FROM 家計簿   
  JOIN 費目     
    ON 家計簿.費目ID = 費目.ID

f:id:shiness:20210121181857p:plain

LEFT JOIN= LEFT OUTER JOIN

SELECT 日付, 費目.名前
FROM 家計簿   
  LEFT JOIN 費目     
    ON 家計簿.費目ID = 費目.ID

結果は変わらない。

RIGHT JOIN= RIGHT OUTER JOIN

SELECT 日付, 費目.名前
FROM 家計簿   
  RIGHT JOIN 費目     
    ON 家計簿.費目ID = 費目.ID

f:id:shiness:20210121182750p:plain

SQL

復習

order by

select 入金額, 出金額 from 家計簿 order by 入金額, 出金額

ソートだと考える

group_by

group_byした列ごとに出す

whereとHaving の違い

whereはグループにする前に条件をつける。Havingはグループ後の適用。

join

単なるjoinとはinnerjoinのこと

[参考] qiita.com

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を用いてコントローラで処理 直接的に入力してもらわない