[Rails4.1.0 beta1] ActiveRecord::Enumを試してみる

ご注意: この記事は Rails 4.1.0 beta1 で試しております。


ActiveRecord::Enum


active_record/enum.rb


お手本通りに。


Bookクラス


class Book < ActiveRecord::Base
enum status: {active: 0, archived: 1}
end

enumで定義した値が、数値に変換されて保存される


book = Book.new
book.status = :archived
book.save!
book
#=> #<Book id: 6, name: nil, status: 1, created_at: "2013-12-20 16:12:41", updated_at: "2013-12-20 16:12:41">

statusへのアクセスは 定数名が返ってくる


book.status
#=> "archived"

statusへのアクセスは 定数名のみ許可される


book.status = 1
#=> ArgumentError: '1' is not a valid status
...

:active, 'active', :archived, 'archived'以外は受け付けなくなる


book.status = :active
# => :active
book.status = :archived
# => :archived

各種ヘルパーの自動生成


book.archived?
# => true or false
book.active?
# => true or false
book.archived!
# == book.update! status: 1
book.active!
# == book.update! status: 0

スコープの自動生成


 puts Book.active.to_sql
# => SELECT "books".* FROM "books" WHERE "books"."status" = 0
puts Book.archived.to_sql
# => SELECT "books".* FROM "books" WHERE "books"."status" = 1

定数の自動生成


puts Book::STATUS
# => {"active"=>0, "archived"=>1}
puts Book::STATUS.class
# => ActiveSupport::HashWithIndifferentAccess

課題 ... ?


form_for


以下のようにすると当然、active, archivedと表示されるが、日本語圏としては、I18nできると嬉しいよね。


form_for @book do |f|
f.label :status
f.select :status, Book::STATUS
end

じゃ、Enum定義を日本語にしてみる?


class Book < ActiveRecord::Base
enum status: {'アクティブ' => 0, 'アーカイブ' => 1}
end

puts Book::STATUS
# => {"アクティブ"=>0, "アーカイブ"=>1}

できた!!! ... わけないよね。。。一応アクセスできるけどね。。。


Book.アクティブ.all

スポンサーサイト

[Rails4]order仕様メモ

ActiveRecord#order


実行するコマンド: Book.order('id ASC')


Rails 3.2.16
SELECT "books".* FROM "books" ORDER BY id ASC

Rails 4.0.2
SELECT "books".* FROM "books" ORDER BY id ASC

一緒。


実行するコマンド: Book.order('id DESC').order('name DESC')


Rails 3.2.16
SELECT "books".* FROM "books" ORDER BY id DESC, name DESC

Rails 4.0.2
SELECT "books".* FROM "books" ORDER BY id DESC, name DESC

一緒。


実行するコマンド: Book.order(:id)


Rails 3.2.16
SELECT "books".* FROM "books" ORDER BY id

Rails 4.0.2
SELECT "books".* FROM "books" ORDER BY "books"."id" ASC

テーブル名が付与。エスケープ処理がされている。


実行するコマンド: Book.order(id: :asc)


Rails 3.2.16
SELECT \"books\".* FROM \"books\" ORDER BY '---\n:id: :asc\n

Rails 4.0.2
SELECT "books".* FROM "books" ORDER BY "books"."id" ASC

Rails3系 フィールド名 => :asc or :desc はの記述方法はNG


まとめ


Rails4系を使用する場合の orderの記法は、id: :asc or id: :desc
とするのが良さそう。


おまけ: Unscope


Rails4から利用可能
まったく無意味なコードだが以下のような書き方ができる
途中で whereとか、orderとかjoinとかの条件を削除できる機能。


Book.joins(:categories).where(code: 'foo').order(id: :desc).scoping do
puts Book.unscope(:joins).to_sql
puts Book.unscope(:where).to_sql
puts Book.unscope(:order).to_sql
end

SELECT "books".* FROM "books"  WHERE "books"."code" = 'foo'  ORDER BY "books"."id" DESC
SELECT "books".* FROM "books" INNER JOIN "books_categories" ON "books_categories"."book_id" = "books"."id" INNER JOIN "categories" ON "categories"."id" = "books_categories"."category_id" ORDER BY "books"."id" DESC
SELECT "books".* FROM "books" INNER JOIN "books_categories" ON "books_categories"."book_id" = "books"."id" INNER JOIN "categories" ON "categories"."id" = "books_categories"."category_id" WHERE "books"."code" = 'foo'
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。