27
Next-L Enju 開発ワークショップ #4 「資料の統計」 2012519田辺浩介

Next-L Enju 開発ワークショップ #4

Embed Size (px)

Citation preview

Page 1: Next-L Enju 開発ワークショップ #4

Next-L Enju 開発ワークショップ #4「資料の統計」

2012年5月19日田辺浩介

Page 2: Next-L Enju 開発ワークショップ #4

前回からの主な進捗

Next-L Enju Leaf 1.0.5.rc3リリースWindows上で動くことを確認

RailsInstallerを使用手間はLinux/Macとあまり変わらない気がする

Page 3: Next-L Enju 開発ワークショップ #4

図書館の統計情報の取得

Page 4: Next-L Enju 開発ワークショップ #4

図書館に必要な統計

貸出回数資料ごと利用者ごと

予約回数資料ごと利用者ごと

Page 5: Next-L Enju 開発ワークショップ #4

図書館に必要な統計

蔵書数館ごと資料区分ごと除籍冊数

利用者数登録者数

Page 6: Next-L Enju 開発ワークショップ #4

図書館に必要な統計

ほかにもなにが必要か考えてみよう!

Page 7: Next-L Enju 開発ワークショップ #4

統計に関係するモデル

書誌 (Manifestation), 所蔵 (Item)

利用者 (User)

貸出 (Checkout), 予約 (Reserve)

図書館 (Library), 書架 (Shelf)

件名 (Subject)

ほかにもあるかも?

Page 8: Next-L Enju 開発ワークショップ #4

決めること

統計に必要なデータの管理はどのモデルの役割かたとえば、「館ごとの蔵書数」

所蔵情報 (Item)

図書館 (Library)

書棚 (Shelf)所蔵は書棚に属し、書棚は図書館に属するため

Page 9: Next-L Enju 開発ワークショップ #4

組み立て戦略

必要なモデルを選ぶ選んだモデル間の関連を追う集計に必要な属性がどのモデルに存在するかを把握する

Page 10: Next-L Enju 開発ワークショップ #4

モデル間の関連

Page 11: Next-L Enju 開発ワークショップ #4

モデル間の関連

1対1

belongs_to / has_one

1対多belongs_to / has_many

has_one through

多対多has_many through

Page 12: Next-L Enju 開発ワークショップ #4

1対1

貸出1件に対する返却は1件返却1件に対する貸出は1件

以下のファイルを見てみようapp/models/checkout.rb

app/models/checkin.rb

Page 13: Next-L Enju 開発ワークショップ #4

1対1

貸出1件に対する返却は1件返却1件に対する貸出は1件

以下のファイルを見てみようapp/models/checkout.rb

app/models/checkin.rb

Page 14: Next-L Enju 開発ワークショップ #4

1対多(1)

1件の所蔵に対する貸出は複数存在1件の貸出に対する所蔵は1件

以下のファイルを見てみようapp/models/item.rb

app/models/checkout.rb

Page 15: Next-L Enju 開発ワークショップ #4

1対多(2)

1人の利用者に対する権限は1件1件の権限に対する利用者は複数

以下のファイルを見てみようapp/models/user.rb

app/models/user_has_role.rb

app/models/role.rb

Page 16: Next-L Enju 開発ワークショップ #4

多対多

1件の書誌に対する出版者は複数存在1人の出版者に対する書誌は複数存在

以下のファイルを見てみようapp/models/patron.rb

app/models/produce.rb

app/models/manifestation.rb

Page 17: Next-L Enju 開発ワークショップ #4

Railsでの関係の定義

モデルとモデルの所属関係を決める所属される側のモデルに以下のカラムを追加所属するモデルのモデル名を

”単数形にし、さらに末尾に _id”をつけるデータ型はinteger

Page 18: Next-L Enju 開発ワークショップ #4

関連の定義例(1)

BlogモデルとPostモデルが存在各モデルは以下のように作成されている

$ rails g scaffold Blog title:string

$ rails g scaffold Post body:text

$ rake db:migrate を忘れないこと

Page 19: Next-L Enju 開発ワークショップ #4

関連の定義例(2)

BlogモデルとPostモデルが存在ひとつのBlogには複数のPostが存在

Blog has_many Posts

Post belongs_to Blog

Page 20: Next-L Enju 開発ワークショップ #4

関連の定義例(3)

app/models/blog.rbに以下を追加has_many :posts

app/models/post.rbに以下を追加belongs_to :blog

Page 21: Next-L Enju 開発ワークショップ #4

関連の定義例(4)

Postモデルにblog_idカラムを追加rails g migration AddBlogIdToPost blog_id:integer

Page 22: Next-L Enju 開発ワークショップ #4

関連の定義例(5)

データを用意するrails c

>> blog = Blog.create(:title => '田辺のブログ')>> post = Post.create(:body => 'Enju開発ワークショップに行ったよ')

Page 23: Next-L Enju 開発ワークショップ #4

関連の定義例(6)

関連を確認し設定する>> blog.posts # blogにひも付いているpostを取得

=> []>> blog.posts << post # postを追加=> [#<Post id: 1, body: "Enju開発ワークショップに行ってきた", created_at: "2012-05-18 18:28:18", updated_at: "2012-05-18 18:29:35", blog_id: 1>]>> blog.posts # もう一度取得してみる

Blogから見たPostは複数あるため、“メソッドが blog.posts”と複数形になってい

Page 24: Next-L Enju 開発ワークショップ #4

関連の定義例(7)

関連づけを逆方向から確認する>> post.blog

=> #<Blog id: 1, title: "田辺のブログ", created_at: "2012-05-18 18:28:04", updated_at: "2012-05-18 18:28:04">

Postから見たBlogはひとつのため、“メソッドが post.blog”と単数形になっている

Page 25: Next-L Enju 開発ワークショップ #4

実習(1)

以下のように作成されたUserモデルがあります$ rails g model User email:string

ひとりのUserはひとつだけBlogを作れるとしますどのように関連を設定すればよいでしょうか

Page 26: Next-L Enju 開発ワークショップ #4

実習(2)

各自で図書館に必要な統計を考えてくださいその集計に必要なモデルを選び、関連を調べてください関連をもとに、クエリを設定してください

Page 27: Next-L Enju 開発ワークショップ #4

実習(2)

図書館に必要な統計を考えようその集計に必要なモデルがどれかを選ぶ