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'})