Movatterモバイル変換


[0]ホーム

URL:


Ryunosuke SATO, profile picture
Uploaded byRyunosuke SATO
35,267 views

Rails あるある

札幌市中央区Ruby会議01 での発表資料です。

Embed presentation

Downloaded 73 times
Rails あるある現場での悩みとアンチパターンhttp://www.nce.co.uk/features/transport/network-rail-changing-track/8622890.article札幌市中央区Ruby会議012014.02.08Ruby札幌佐藤 竜之介(Ryunosuke SATO)
提供From Sapporo, with Love for Ruby.Ruby札幌
自己紹介
@tricknotesI am a software developer wholove JavaScript and Ruby.http://tricknotes.hateblo.jp/
I love OSS
札幌市中央区Ruby会議01
Sapporo.jshttp://sapporojs.org/
よろしくお願いします
Rails あるある現場での悩みとアンチパターンhttp://www.nce.co.uk/features/transport/network-rail-changing-track/8622890.article札幌市中央区Ruby会議012014.02.08Ruby札幌佐藤 竜之介(Ryunosuke SATO)
今日の話Rails には便利で魅力的な機能がたくさんありますそれらを使えば、簡単にアプリケーションを作ることができますしかし、使いどころを間違えると、あとで変更に弱くなってしまい開発が苦しくなることがあります。自分が体験した あるある ネタを紹介しつつ、メンテナンスしやすいアプリケーションについて考えてみます
すでに Rails をやっているひと、これからやろうとしているひとにとって、快適に開発をするためのヒントになれば嬉しい* 状況設定は架空のものです *
対象バージョン* Ruby 2.0, 2.1* Rails 3.2, 4.0
あるある集
あるある①‘社員レコードは論理削除で...default_scope
状況* 社員の勤怠システムを考える* 社員は退職することができる* 社員が退職した場合、社員は社員一覧に表示されない* ただ、社員の勤怠履歴を参照することはできる必要がある* そのため、社員レコードに対しては論理削除を適用する* `default_scope` !!
default_scope とは“デフォルト” の検索条件を指定できる機能User.where(deleted_at: nil)class User < ActiveRecord::Basedefault_scope lambda {where(deleted_at: nil)}endUser.all
default_scope とは“デフォルト” の検索条件を指定できる機能@user.destroy@user.update_attribute :deleted_at,DateTime.nowhttp://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html#method-i-default_scope
Staff1nAttendance
問題@attendance.staff #=> nilStaff.unscoped {@attendance.staff #=> <#Staff>}そもそも、”削除” ではないのでは...??
解決1退会/移動などを state で持っておいて、必要に応じて scope をかけるclass Staff < ActiveRecord::Basescope :only_tenured, lambda {where(state: :tenured)}endStaff.allStaff.only_tenured
解決2まったく参照しない = 不要なデータ不要なデータは実際に消してしまうStaff.destroy
ポイント*“default” は “default”*ある条件のときに解除したくなるものは“default” ではない*まったく参照しないなら DB に残っている必要はない
あるある②‘ブログ記事にタグをつけたいserialize
状況* ブログシステムを考える* 記事にはタグを登録することができる* タグは自由入力のテキストで、ひとつの記事に複数のタグを付けることができる* すでに多くのテーブルが存在していて、極力テーブルを増やしたくない* `serialize` !!
serializeRuby のオブジェクトを YAML にシリアライズして、データベースのカラムに保存するclass Post < ActiveRecord::Baseserialize :tagsend@post = Post.new@post.tags = ['Ruby', 'chuork01']@post.savePost.last.tags #=> ['Ruby', 'chuork01']http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize
問題特定のタグをもっている記事だけを取得したいタグ毎に記事を一覧したいときに不便YAML なので、 SQL で検索できないPost.where(tags: 'LIKE %Ruby%')Text 型なので Like 検索はできるけど...
解決1タグを別のテーブルに分けるPost1 nTaggingn1Tag
解決1タグを別のテーブルに分けるclass Post < ActiveRecord::Basehas_many :taggingshas_many :tags, through: :taggingsendclass Tagging < ActiveRecord::Basebelongs_to :postbelongs_to :tagendclass Tag < ActiveRecord::Basehas_many :taggingshas_many :posts, through: :taggingsend@tag.posts
解決2配列型を利用する(データベースがサポートしていれば)PostgreSQL の例class AddTagsToPosts < ActiveRecord::Migrationdef changeadd_column :posts, :tags, :arrayendendPost.where("'Ruby' = ANY (tags)")
ポイント*Ruby の世界でしか扱えないデータは扱いづらい*適切なデータモデルを選択しましょう
あるある③‘一時保存のときは入力チェックをしたくないsave(validate: false)
状況* 会員登録できるサービスを考える* Email だけあれば仮登録できるが、本登録では名前などその他の情報が必要* ひとまずレコードだけ作りたい* `save(validate: false)`
save(validate: false)validation をスキップして保存することができるhttp://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save
問題*不完全な状態のデータが保存される*一部の validation だけ実行するのが困難*データベースに制約をかけられなくなる
解決1* 状況に応じた validation を行なうclass Staff < ActiveRecord::Basevalidates :name, presence: {on: :registration}end@staff.save(context: :registration)
解決2* “仮登録”/”本登録” 状態を持たせて validationclass Staff < ActiveRecord::Basevalidates :name, presence: {if: :registration?}def registration?state == 'registration'endend@staff.state = 'registration'@staff.save
ポイント*データを保存するために、チェックが必須な項目をスキップしてしまう*不完全なデータが登録されてしまう
あるある④‘他のシステムと連携するためのJSON の API を提供したいas_json
状況* 人事評価システムを考える* 社員の評価を他システムに対しても提供する* 連携のためのデータを JSON で出力する* `as_json`
as_jsonモデルを JSON へに変換した場合のデータフォーマットを定義するRails が as_json を呼び出して JSON に出力してくれるhttp://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
as_jsonclass User < AvtiveRecord::Basedef as_json{id: id,name: name,evaluations: evaluations.as_json}endendclass UsersController < ApplicationControllerdef index@users = User.allendend
as_jsonGET /users.json[{}]“id”:1,“name”: “tricknotes”,“evaluations”: [{...}, {...}]http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json
問題データの表示/非表示の扱いが難しい*ログインしていると見える情報*本人だけ見える情報*権限によって見える情報*一覧だと不要で、詳細画面だと必要な情報例: 部長は部下の評価を閲覧できるが、部員は本人の評価のみを閲覧できる
問題current_user を参照したくなるので、Model#as_json だと扱いが難しいcontext に依存する変換はモデルの仕事ではないJSON とはデータの表現形式-> View 層の仕事
問題その他のデータ形式をサポートしたくなった場合、似たようなメソッドが並ぶas_csv* as_json...*
解決View として JSON を出力するjbuilder* app/views/users/index.json.jbuilderjson.array!(@users) do |user|json.extract! user,:id,:name,:evaluationsend
ポイント*Context によって変化するロジックをモデルに持たせない*データの表示形式はモデルに含めない
他にもまだまだ...
******STIsession にオブジェクトを保存最終更新日 = updated_atmonkey patchbefore/after callbackgem の version 固定...
for more information...
もっと複雑な現実問題に対応するためのヒント
Rails AntiPatternshttp://www.amazon.co.jp/dp/0321604814
Ruby on Rails: The Bad Partshttp://magazine.rubyist.net/?0041-RailsTheBadParts
まとめ
最初から完璧な設計をするのは困難アカンと思ったら引き返す/直す勇気を!機能自体が悪かというとそうでもなくて、使いドコロを間違うと辛い、という話Rails の機能自体を理解すること、作るものを理解することが大事!!
パッと見て便利そうな機能でも、その機能の意味と、ドメインを考えて組み立てるの大事!!状況によって適切な選択かどうかは変わってくる
Rails の機能自体への理解対象領域への理解作ってわかることもある変更する勇気
http://www.flickr.com/photos/sakura-kame/479871795/一歩、一歩

Recommended

PDF
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
PPTX
TPS/リーンを使って強化するアジャイル/スクラム
PDF
Is No More QA Idealist Practical and Something Tasty?
PDF
Bitcoinを技術的に理解する
PDF
LiDAR点群と画像とのマッピング
PDF
20090924 姿勢推定と回転行列
PDF
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
PDF
NumPyが物足りない人へのCython入門
PDF
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
 
PDF
アジャイル開発とメトリクス
PDF
実践多クラス分類 Kaggle Ottoから学んだこと
 
PPTX
ソフトウェアの品質保証の基礎とこれから
PPTX
テスト設計・テストケース作成 グループ
PDF
【学会聴講報告】CVPR2024からみるVision最先端トレンド / CVPR2024 report
PDF
リーン開発の本質 公開用
PDF
フロー効率性とリソース効率性、再入門 #devlove #devkan
PDF
日本のテスト産業の国際競争力 ~日本をソフトウェアテスト立国にしよう~
PDF
TLS, HTTP/2演習
PDF
「クックパッドとZaimのグロースハックについて」
PDF
建設シミュレータOCSの開発 / OCS・VTC on Unity におけるROS対応機能について
PPTX
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証
PDF
KPTとKPTA
PDF
UnityとROSの連携について
PDF
LEANSTARTUPアンチパターン #devlove #leanstartup
PDF
AI と個人情報 ~AI 学習用データとしての個人情報と AI 処理対象としての個人情報~
PDF
MIRU2013チュートリアル:SIFTとそれ以降のアプローチ
PPTX
Self-Critical Sequence Training for Image Captioning (関東CV勉強会 CVPR 2017 読み会)
PDF
gem の探し方
PPTX
プレゼンの基本

More Related Content

PDF
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
PPTX
TPS/リーンを使って強化するアジャイル/スクラム
PDF
Is No More QA Idealist Practical and Something Tasty?
PDF
Bitcoinを技術的に理解する
PDF
LiDAR点群と画像とのマッピング
PDF
20090924 姿勢推定と回転行列
PDF
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
PDF
NumPyが物足りない人へのCython入門
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
TPS/リーンを使って強化するアジャイル/スクラム
Is No More QA Idealist Practical and Something Tasty?
Bitcoinを技術的に理解する
LiDAR点群と画像とのマッピング
20090924 姿勢推定と回転行列
ソフト高速化の専門家が教える!AI・IoTエッジデバイスの選び方
NumPyが物足りない人へのCython入門

What's hot

PDF
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
 
PDF
アジャイル開発とメトリクス
PDF
実践多クラス分類 Kaggle Ottoから学んだこと
 
PPTX
ソフトウェアの品質保証の基礎とこれから
PPTX
テスト設計・テストケース作成 グループ
PDF
【学会聴講報告】CVPR2024からみるVision最先端トレンド / CVPR2024 report
PDF
リーン開発の本質 公開用
PDF
フロー効率性とリソース効率性、再入門 #devlove #devkan
PDF
日本のテスト産業の国際競争力 ~日本をソフトウェアテスト立国にしよう~
PDF
TLS, HTTP/2演習
PDF
「クックパッドとZaimのグロースハックについて」
PDF
建設シミュレータOCSの開発 / OCS・VTC on Unity におけるROS対応機能について
PPTX
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証
PDF
KPTとKPTA
PDF
UnityとROSの連携について
PDF
LEANSTARTUPアンチパターン #devlove #leanstartup
PDF
AI と個人情報 ~AI 学習用データとしての個人情報と AI 処理対象としての個人情報~
PDF
MIRU2013チュートリアル:SIFTとそれ以降のアプローチ
PPTX
Self-Critical Sequence Training for Image Captioning (関東CV勉強会 CVPR 2017 読み会)
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
 
アジャイル開発とメトリクス
実践多クラス分類 Kaggle Ottoから学んだこと
 
ソフトウェアの品質保証の基礎とこれから
テスト設計・テストケース作成 グループ
【学会聴講報告】CVPR2024からみるVision最先端トレンド / CVPR2024 report
リーン開発の本質 公開用
フロー効率性とリソース効率性、再入門 #devlove #devkan
日本のテスト産業の国際競争力 ~日本をソフトウェアテスト立国にしよう~
TLS, HTTP/2演習
「クックパッドとZaimのグロースハックについて」
建設シミュレータOCSの開発 / OCS・VTC on Unity におけるROS対応機能について
QAアーキテクチャの設計による 説明責任の高いテスト・品質保証
KPTとKPTA
UnityとROSの連携について
LEANSTARTUPアンチパターン #devlove #leanstartup
AI と個人情報 ~AI 学習用データとしての個人情報と AI 処理対象としての個人情報~
MIRU2013チュートリアル:SIFTとそれ以降のアプローチ
Self-Critical Sequence Training for Image Captioning (関東CV勉強会 CVPR 2017 読み会)

Viewers also liked

PDF
gem の探し方
PPTX
プレゼンの基本
PDF
伝わるプレゼンをする方法
PDF
綺麗なプレゼン資料の作り方、10のテクニック
PDF
良いプレゼン 良いスライド
PDF
魅せるPowerPointビジネスプレゼン【実践編】 
PPT
素敵なプレゼン資料を作るためのKnow-Howてんこ盛りセッション:プレゼン道場 Ver 2.2
PDF
しょぼいプレゼンをパワポのせいにするな! by @jessedee
PDF
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
PPT
色彩センスのいらない配色講座
PDF
見やすいプレゼン資料の作り方 - リニューアル増量版
gem の探し方
プレゼンの基本
伝わるプレゼンをする方法
綺麗なプレゼン資料の作り方、10のテクニック
良いプレゼン 良いスライド
魅せるPowerPointビジネスプレゼン【実践編】 
素敵なプレゼン資料を作るためのKnow-Howてんこ盛りセッション:プレゼン道場 Ver 2.2
しょぼいプレゼンをパワポのせいにするな! by @jessedee
ビジネスマン必見!キレイな提案書を作るためのデザインの基礎知識
色彩センスのいらない配色講座
見やすいプレゼン資料の作り方 - リニューアル増量版

Similar to Rails あるある

PDF
Why did I become a ruby committer
PDF
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
KEY
実録!Railsのはまりポイント10選
PDF
Railsハイパー実践講座-第35回NaCl勉強会
PDF
「バグあるある」と「仕様変更あるある」一挙大放出SP!
 
PDF
Ruby on Rails 入門
PPTX
エンタープライズRuby on Rails ~エンプラでぶち当たった2つの壁と突破法~
PDF
名古屋Ruby会議02 LT:Ruby中級への道
PPTX
第3回輪講
PDF
今さらながらRSpecに入門してみた
PDF
20110820 metaprogramming
KEY
Clojure programming-chapter-2
PDF
20120706-readablecode
PDF
Ruby 3の型推論やってます
PDF
怖いRails
ODP
RSpecのここがすごい!
 
PDF
Code Anything
ODP
とっとるびー(2回目)発表資料
PPTX
RubyとJavaScriptに見る第一級関数
PDF
Introduction of record_with_operator
Why did I become a ruby committer
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
実録!Railsのはまりポイント10選
Railsハイパー実践講座-第35回NaCl勉強会
「バグあるある」と「仕様変更あるある」一挙大放出SP!
 
Ruby on Rails 入門
エンタープライズRuby on Rails ~エンプラでぶち当たった2つの壁と突破法~
名古屋Ruby会議02 LT:Ruby中級への道
第3回輪講
今さらながらRSpecに入門してみた
20110820 metaprogramming
Clojure programming-chapter-2
20120706-readablecode
Ruby 3の型推論やってます
怖いRails
RSpecのここがすごい!
 
Code Anything
とっとるびー(2回目)発表資料
RubyとJavaScriptに見る第一級関数
Introduction of record_with_operator

More from Ryunosuke SATO

PPTX
片手間JS on Rails
PDF
Ember コミュニティとわたし
PDF
Node.js を選ぶとき 選ばないとき
PDF
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
PDF
はじめる Ember.js!! ~ Getting started with ember.js ~
PDF
How to relaunch "sapporojs.org" ~Introduction to middleman~
PDF
Introduction for Browser Side MVC
PDF
コミュニティのある風景
KEY
capybara で快適なテスト生活を
PDF
Testable JavaScript
PDF
Social coding をもっと楽しみたいあなたへ
PDF
Clean Javascript
KEY
Node.jsってどうなの?
KEY
アジャイル的アプローチから見えてきたこと
PDF
脱レガシー化計画
PDF
Pusherとcanvasで作るリアルタイムグラフ
PDF
ServerSideJavaScript
片手間JS on Rails
Ember コミュニティとわたし
Node.js を選ぶとき 選ばないとき
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
はじめる Ember.js!! ~ Getting started with ember.js ~
How to relaunch "sapporojs.org" ~Introduction to middleman~
Introduction for Browser Side MVC
コミュニティのある風景
capybara で快適なテスト生活を
Testable JavaScript
Social coding をもっと楽しみたいあなたへ
Clean Javascript
Node.jsってどうなの?
アジャイル的アプローチから見えてきたこと
脱レガシー化計画
Pusherとcanvasで作るリアルタイムグラフ
ServerSideJavaScript

Rails あるある


[8]ページ先頭

©2009-2026 Movatter.jp