Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
株式会社LITALICO のklrutsaです。 『LITALICO Advent Calendar 2016』13日目の記事です。 はじめに 私が遭遇した、Railsアンチパターン集です。 笑えるよりも、笑えないコードのほうが多いですが、よろしくお願いします。 前回の、負債を抱えすぎたRailsアプリのリファクタリング - Qiitaでは、複雑な状態遷移への対応方法を書きましたが、その他の負債をどうしたかみたいなことについて書いてみます。 一般的に書いてはいけない、とまではいえないかもしれないですが、 個人的には書かないほうが良いと思っているコード集です。 default_scope class Article < ActiveRecord::Base default_scope { where(status: 'publish') } end 要点 プログラマの認識している動作と実際の
4. @tricknotes I am a software developer who love JavaScript and Ruby. http://tricknotes.hateblo.jp/
モデルのスコープ機能とは、共通的に使うクエリをモデルのメソッドのように定義できる機能です。 こうすることにより、複雑なSQLを何度も書かなくてよくなり、可読性と保守性を向上させることができます。 動作確認 Rails 4.1 目次 スコープ(Scope)の概要 スコープに引数を指定 スコープのマージ デフォルトスコープの設定 1. スコープ(Scope)の概要以下の2つの方法で「共通的に使うクエリをスコープ」として定義できます。 # 定義方法1: scopeメソッドで定義 class Post < ActiveRecord::Base scope :published, -> { where(published: true) } end # 定義方法2: クラスメソッドのように定義 class Post < ActiveRecord::Base def self.published whe
rails3。 default_scope order('id') としたときに、ソート対象を変更する方法。ただorderを追加するだけだと後ろにくっついてしまうのでうまくありません。 Model.order('id DESC') #=> "ORDER BY id, id DESC" 正解。 Model.reorder('id DESC') このreorderがなかなか見つかりませんでした。unscopedを使えってのはいっぱい見つかるのですが、確かに Model.unscoped.order('id DESC') はうまくいきます。しかし、他のscopeは使いたい、と思ってこんなことしても # scope public_item where("ispublic = true") Model.unscoped.public_item.order('id DESC') # => "ORDER
1.0.0 1.1.6 1.2.6 2.0.3 2.1.0 2.2.1 2.3.8 (0) 3.0.0 (7) 3.0.9 (-1) 3.1.0 (26) 3.2.1 3.2.8 3.2.13 4.0.2 4.1.8 4.2.1 4.2.7 4.2.9 5.0.0.1 5.1.7 5.2.3 6.0.0 6.1.3.1 6.1.7.7 7.0.0 7.1.3.2 7.1.3.4 What's this? Class methods (218) === (<= v3.2.13) abstract_class? (<= v3.1.0) accessible_attributes (<= v2.3.8) active_connection_name (<= v2.1.0) add_conditions! (<= v2.3.8) add_group! (<= v2.3.8) add_joins!
モデルからデータを取得する際に常に特定の検索条件を指定することができるdefault_scopeですが、 デメリットについてあまり注意を払わずに使ってしまって失敗しました。 サンプル事例 環境 * Rails 3.2.12, 4.0 * MySQL 5.1.65 ※ 実際に問題が起きたバージョンが3.2.12 なのでそちらが中心になっています。 データを「名前」「年齢」どちらか指定された値で並び替えるという処理があったので、 特に指定が無ければid順で取得するという条件をdefault_scope を使って追加しました。 class User < ActiveRecord::Base default_scope -> { order(:id) } end これで、モデルからデータを取得する際に必ずORDERが指定されるようになります。 User.all #=> SELECT "users"
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く