Modelの初歩
モデルの生成
railsコマンド(rails) - - Railsドキュメント
rails g model Entry title:string body:text
rails g model Comment body:text status:string entry_id:integer
関連(association)
[初心者向け] Railsで関連するデータ(親子関係)を保存する方法あれこれ
相互のクラスに
has_many : comments (自分から見てコメントたくさん)
belongs_to :entry (自分から見てエントリーは一つ)
親子関係の保存方法色々!
1.
entry = Entry.create(text : "aa")
comment = entry.comments.create(text:"ee")
entry = Entry,create(text : "aa")
comment = entry.comments.build(text "ee")
2.
entry = Entry,create(text : "aa")
comment = Comment.new(text: "ee)
entry.comments << comment
3.
entry = Entry,create(text : "aa")
comment = Comment.new(text "ee")
comment.entry = entry
comment.save
entry = Entry,create(text : "aa")
comment_1 = Comment.new(text: "ee", entry: entry)
comment_1.save
comment_2 = Comment.create(text "oo", entry: entry)
4.
entry = Entry,create(text : "aa")
comment = Comment.new(text: "ee")
comment.post_id = post.id
comment.save
rails consoleを快適に使う
https://blog.dakatsuka.jp/2011/05/14/hirb-rails-console.html
group :development do
gem 'hirb'
gem 'hirb-unicode'
end
あとは rails console を起動して Hirb.enable
これでデータベースが見やすくなる!
Entry.allとかしてみるといい感じ。
ホームに.irbrcを作って下のやつ打ち込んで置くと毎回Hirb.enableしなくて済む
if defined? Rails::Console
ActiveRecord::Base.logger = Logger.new(STDOUT)
if defined? Hirb
Hirb.enable
end
end
データの検索
Rails / アソシエーションした先のデータを持っていないレコードを検索する | Workabroad.jp
アソシエーションした先のデータについて検索
>Entryのid:1に紐付くComment
Entry.find(1).comments
>statusがunapprovedのEntry
entry = Entry.includes(:comments).where(:comments => { :status => 'unapproved'} )
より複雑なモデル関連
Blog 1---* Entry 1---* Comment
上記のように拡張する。
rails g model Blog title:string
rails g migration add_blog_id_to_entries blog_id:integer
rails db: migrate
今まで通り自由に挿入する。
今回は
blog = Blog.find(1)
entry = Entry.find(1)
blog.entries << entry
ってやって代入した。
2つ先のassociationテーブルをjoinしwhereする - ピスタチオを食べながらrailsを楽しむ
ActiveRecord ~ 複数テーブルにまたがる検索(先読み、JOINなど)
>Blogのid:1に紐付くすべてのComment
Blog.joins(entries: :comments).where(id: 1).select("comments.*")
>Entryを書いてないBlog
Blog.includes(:entries).where(:entries => {:blog_id => nil })
>statusがunapprovedであるCommentがあるEntryのあるBlog
Blog.includes(entries: :comments).where(:comments => {:status => 'unapproved'})