二つのテーブルを繋ぐ存在、中間テーブル
#中間テーブルとは
二つのアソシエーションしたいテーブル同士が「多対多」の関係のときに、テーブルの間を受け持つ、便利なやつ。
##具体例
LINEを思い浮かべると、一人のユーザーはいくつものグループに所属している。また、一つのグループには、何人ものユーザーが招待されている。このとき、ユーザーとグループは「多対多」の関係と言える。
##問題点
「多対多」のテーブルをそのままアソシエーションすることが困難である。
##解決策
先の例で言えば、ユーザーとグループの間に組み合わせを記録するテーブルをかませる。それが、中間テーブル。ユーザーとグループの組み合わせを記録するというのがポイントで、カラムにはユーザーidとグループidが必要となる。
##記述
アソシエーションをするため、「has_manyメソッド」「belongs_toメソッド」を使う。
そのモデル(テーブル)ファイルの目線になって、繋がりを持ちたいモデル(テーブル)にはが複数か単数か考える。
ex) user(モデル) has_many groups
ここは、もはや英語の話。
“`Ruby:group.rb
ha
#Ruby on RailsにてRails new〜デプロイまでの忘備録2です!
、Rails newコマンドでアプリケーション作成からデプロイまでの一連をつらつらと書いていきます。
前回
https://qiita.com/gonshiba-n/items/abd1b11e35f99eb5975f
##Railsアプリケーションの日本語化と日本時間適応
“`config/application.rb
require_relative ‘boot’
require ‘rails/all’
# Require the gems listed in Gemfile, including any gems
# you’ve limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
module xxxxxx
class Application < Rails::Application
# Initialize configuration defaults for o
deviseも便利な機能が故、それぞれ独自のメソッドが自動で生成してくれるルーティングについて、こんがらがってしまいます。
そんな同じお悩みの方はぜひ。
#devise_for
“`routes.rb
devise_for :users
“`
“`bash:
$ rails routes
Prefix Verb URI Pattern Controller#Action
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_pa
Ruby
Rails
devise
RubyOnRais
#まえがき
テーブルでのデータ設定で、便利かなと思ったので、1つ・複数 のテーブルへのデータ設定を記録します。
いずれも、最後に save を行いますので。忘れずに!
データを取り出す時に、エラーになってしまいますよ!!
#テーブルへのデータの作成
##1つのデータ設定
“`terminal:コマンド
rails console
変数1 = モデル名.new(カラム名: “内容”)
test1 = Test.new(description: “smple_text”)
変数1.save
test1.save
“`
##複数のデータ設定
先のコマンドに , を入力します。
“`terminal:コマンド
rails console
変数1 = モデル名.new(カラム名: “内容”,カラム名: “内容”)
test1 = Test.new(description: “smple_text”,title: “smple_title” )
変数1.save
test1.save
“`
#あとがき
ここまで読んでいただき、ありがとう
Ruby
データベース
テーブル
RubyOnRais
Rails6
#まえがき
今回は、Ruby on Rails6 でデーターベースのテーブルを作成する方法を忘却録として残します。
#モデルとテーブルを作成する方法
bin/ ・・・ は Linux の開発環境で使用します。
(私はMAC{Unix}での開発環境で不要な文字ですが、知識として持っておくといいと思います。)
また、テーブル名前は “Form” の様に 頭文字を大文字にすると良いです。
##モデルと1種類のカラムの作成
“`terminal:コマンド
$ bin/rails g model Smple_form title:string
$ bin/rails g model デーブル名 カラム名:データ型
or
$ bin/rails generate model Smple_form title:string
$ bin/rails generate model デーブル名 カラム名:データ型
“`
##モデルと複数のカラムの作成
“`terminal:コマンド
$ bin/rails g model S
Ruby
データベース
RubyOnRais
Rails6
# 筆者について
ProgateのRuby, Railsコースを一通りやった。
その後Dockerで環境作ってRailsでAPIサーバー作った。
# 本記事について
Progateではviewを含んだrailsの書き方を学んだが、APIサーバーとしてのみRailsを使いたかった。
また、dockerで開発したかったため公式の[クイックスタート](https://docs.docker.com/compose/rails/)を参考にRailsの開発環境を作った。
その過程で得られたノウハウをまとめる。
APIサーバーの開発で使うGemについては別記事で書く。
# 前提
Docker, docker-composeの使い方がわかること
# 環境
Ruby 2.7
MySQL 5.7
VSCode
Mac 10.14.5
Sequel Pro データベース見る用
# Rails new するまで
まずはプロジェクトフォルダを作成。ここではrails-sampleとした。
そして、この直下に Dockerfileを作成
“`Dockerfile
FROM ruby:2.7
## Rakeタスクってなに
タスクってなに、、、「やること」っていう意味かな。はじめて聞いた時はそう考えましたが、調べてみるとRuby on Railsにはタスクというものが存在するらしい。
### Rakeタスクとは
このタスクという機能は、いちいちアプリケーションを立ち上げるなくてもターミナルから任意の処理を実行することができるものらしい。自分が携わっているアプリケーションでは、開発段階でサンプルのデータが必要だったので、それをこのタスクというものを使って作成した。
## タスクを作成してみる
“` ruby
rails g task sample
“`
これで“sample.rake“というタスクに関するファイルを作成する。
“lib/tasks“にsample.taskという名前のファイルを作成。
“` ruby
namespace :greet do
end
“`
作成したファイルには、デフォルトで上のようなコードが書かれている。
この中を自分がタスクとして行いたい処理をコマンド一つで実行されるように書いていく。
“` ruby
# タスク名前
【概要】
—————————————-
1.結論
2.includeメソッドとは何か
3.どのようにプログラムしたか
1.結論
—————————————-
include?メソッド を使う!
2.include?メソッドとは何か
—————————————-
include?は配列の中に指定した要素が、あるかを判定するメソッドです!
3.どのようにプログラムしたか
—————————————-
“`ruby
def array_hello(strs)
if strs.include?(hello)
puts “True”
else
puts “False”
end
end
“`
“strs”の引数から”hello”という文字を探したいので、
strs.inc
#前提条件
ECサイトでECサイトで注文情報入力 ==> 注文確認画面の間に注文情報入力でバリデーションをかけたい
#1.よく使うバリデーション
“`rails:app/models/book.rb
validates :title, presence: true
“`
などの普段よく使うバリデーションは
booksテーブルにtitleというカラムがあり
データベースに保存される時、つまり @book.save(book_params)の時にtitleカラムが空白だとバリデーションがかかる。
しかし、ECサイトで注文情報入力 ==> 注文確認画面
==> 注文確定(ここで`.save`が行われる)というフローで実装する際、注文情報入力 ==> 注文確認画面の間に`.save`が発生しない為、モデルにかけるバリデーションをrenderで呼び出すことができない為if文で条件分岐を書いて`flash[:notice]`を使う必要がある。
#2.if文の実装
“` rails:app/controllers/order_controllers.rb
when 3
#はじめに
ネット上には素晴らしいフリーフォントがたくさんあります。
デザインの表現の幅を広げるために是非、活用していきたいところ。
そこで、フリーフォントをRailsに導入していきます。
##フォントファイルの導入
ここでは導入したいフォントファイルを`smog.otf`とします。
`public`フォルダに`fonts`フォルダを作り、そこにフォントファイルを配置。
“`
– public
– fonts
– smog.otf
“`
使用するcssファイル(ここでは`sample.css`)に以下のコードを追加します。
`font-family`の名前は自由に設定できます、今回は`’Smog’`としましょう。
また`format`はファイルのフォーマットに合わせます。
| フォーマット | 拡張子 |
|:-:|:-:|
| format(‘woff’) | .woff |
| format(‘truetype’) | .ttf |
| format(‘opentype’) | .otf または .ttf |
| format(‘embedd
#前提
gem bootstrapを使用
#やりたいこと
Railsを使ってレスポンシブな画面を作る。
その際に文字の大きさをいい感じに大きくしたり小さくしたりしたい。
##結論
“`scss:app/assets/stylesheets/application.scss
body, html { font-size: 30px; }
@media screen and (min-width: 576px) and (max-width: 768px) { body, html { font-size: 30px; } }
@media screen and (min-width: 769px) and (max-width: 992px) { body, html { font-size: 30px; } }
@media screen and (min-width: 993px) and (max-width: 1200px) { body, html { font-size: 16px; } }
@media screen and (min-width: 1201px) {
#はじめに
非同期でjobを処理してくれる[sidekiq](https://github.com/mperham/sidekiq)を導入する中で、利便性を生かしつつも自分のアプリ専用にカスタマイズしたい、そんな時に役に立った設定をまとめています。
#sidekiqとは
sidekiqとは、非同期処理を可能にしてくれるライブラリです。複数のジョブを同時に実行させる時などに、各ジョブのqueueの名称を分けることで、処理の優先順位を指定することができます。似たようなライブラリにresqueやdelayed_jobなどがあるかと思います。
簡単に導入できるのですが、つまづいてしまったキューをデフォルトで25回だか26回だかリトライするとか、その後はDEADとなって実行していたキューのログが見られないなどといった面倒な点もあります。
そこでこの記事では、例外を投げた時などにいつまでもリトライせず上限を設定してDEADとし、その際にslackにキューの内容とエラーメッセージを投げるという設定をする方法についてお話しします。
#環境
Ruby 2.6.6
Rails 6.0.2
sideki
Ruby
Rails
Gem
sidekiq
Slack
Rubyには、`$1, $2, $3 …`という特殊変数があり、`$n`には最後に成功したパターンマッチで n 番目の括弧にマッチした値が代入されます。
“`ruby
“abc” =~ /(.)(.)(.)/
p $1 #=> “a”
p $2 #=> “b”
p $3 #=> “c”
“`
[2020/09/26現在のるりま](https://docs.ruby-lang.org/ja/latest/method/Kernel/v/1.html)には
> 番号 n はいくらでも大きな正整数を利用できます。
とありますが、実際には超巨大な値を使おうとすると、warningが表示されます (遊んでいるときに気が付いた)
“`
$ ruby -e ‘$9999999999999999′
-e:1: warning: `$9999999999999999’ is too big for a number variable, always nil
“`
こうなると`$n`のnとしてどれだけの値が使えるのか気になってくるので、簡単な二分探索を使った以下のコードで調べてみた
昨日のドリルで登場したFizzBuzz問題。
模範回答としては、
“`
def fizz_buzz
num = 1
while num <= 100 do
if num % 15 == 0
puts "FizzBuzz"
elsif num % 3 == 0
puts "Fizz"
elsif num % 5 == 0
puts "Buzz"
else
puts num
end
num = num + 1
end
end
fizz_buzz
```
というのが正解だったけど、
rubocopを使ったところ、
```
def fizz_buzz
num = 1
while num <= 100
if (num % 15).zero?
puts 'FizzBuzz'
elsif (num % 3).zero?
puts 'Fizz'
elsif (num % 5).zero?
puts 'Buzz'
標準入力からの文字列との比較処理を行ったところ、なぜかうまく行かなかったので
その原因と解決策を備忘録として記載します。
## 問題点
`gets`メソッドは標準入力からの文字列を受け取るためのメソッドです。
このメソッドを利用して取得した入力文字列と別の文字列を比較しようとすると
思い通りの結果が得られませんでした。
“`ruby
input = gets # hogeを入力
bool = (input == ‘hoge’)
print bool
“`
“`
false
“`
同じ値の文字列同士を比較してるはずなのになぜか`false`が返ってきました。
## 原因
調べたところ、どうやら`gets`メソッドは標準で末尾に**改行コード(\n)**を追加するみたいです。
“`ruby
input = puts # hogeを入力
p input
“`
“`
“hoge\n”
“`
改行コードが含まれている状態で比較しようとしていたので、比較しても弾かれてたみたいです。
## 解決策
末尾の改行コードを削除すればよさそうなので調べてみたところ、
のっぴきならない事情があり、フォームの入力パターンに応じて、バリデーションメッセージを生成後に加工したかったのでメモ。
例えば、下記のようなフォームがあったとする。
“`ruby:new.slim
= form_for post_form, url: confirm_post_path do |f|
– if post_form.errors.present?
ul
– post_form.errors.full_messages.each do |msg|
li = msg
“`
しかし、フォーム内の特定の選択肢を選んだ場合に、バリデーションメッセージを変えるという要件が加わったとする。
この場合、errors.full_messages は Array なので、Decorator で中身を1件ずつチェックして力技で置換した。
“`ruby:new.slim
= form_for post_form, url: confirm_post_path do |f|
– post_form_decorator = ::PostFor