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



