There's an echo in my head

日々のメモ。

ruby

RSpecにdescribeやcontextで使えるメソッドを実装する

describeやcontext間で共通する処理をメソッドにするとスッキリするんだけど、それをspecファイルをまたいで共有したいときに。 module RSpec module Core module MyHelper # 適当に名付ける module ExampleGroupMethods def my_let(*args) p args let(*args…

Kernel.rand(n)はnが整数値の場合にn未満の値を返す

よく忘れるのでメモ。 Kernel.rand(n)は、nが整数値の場合には0..(n-1)の範囲の整数をランダムで返す。 つまり、rand(2)とやっても返ってくるのは0もしくは1のどちらかのみで、2が返ってくることはない。

serialize-rails gemでJSONをDBに格納する

ActiveRecordのserializeはYAMLにしか対応していないけど、serialize-railsを使うとJSONやXML、RubyのMarshalも保存できるようになる。 # Gemfile source 'http://rubygems.org' gem 'rails', '3.2.9' # 3.0.0 以上が必要 gem 'serialize-rails' # app/model…

クラス変数とインスタンス変数

class Klass @iv = 1 @@cv = 2 def self.iv; @iv end def self.cv; @@cv end def iv; @iv end def cv; @@cv end end class SubKlass < Klass end # クラスのインスタンス変数を参照してみる Klass.iv #=> 1 SubKlass.iv #=> nil Klass.new.iv #=> nil SubKla…

ruby 2.0.0-preview2を入れた

12/1にリリースされてたので入れた。 基本的にはruby 2.0.0-preview1と導入方法は同じで、ruby-installを更新したあとでインストール。 ちなみに環境はOS X 10.8.2 Mountain Lion。 $ cd ~/.rbenv/plugins/ruby-build $ git pull origin master $ CONFIGURE_…

bundlerでgemを作る

不完全ながらメモ。 雛形を作る $ bundler gem hello こうするとhelloディレクトリが作られて、その中にひな形のファイル(hello.gemspecとかlibとかが作られる)。 hello.gemspecを変更する TODOと書かれているgem.description、gem.summaryは変更しないとr…

Object#instance_execでブロック引数を省略する

def configure(&block) @config ||= Configuration.new block.call(@config) end configure do |config| config.use :yaml end みたいなのが、Object#instance_execを使うとスッキリ書ける。 def configure(&block) @config ||= Configuration.new @config.i…

ruby 2.0.0-preview1を入れてみる(成功)

前回のログをさかのぼってみたらreadlineまわりでもエラーが起きていた。 なので、readlineも入れなおしてやってみたところ上手くいった。 ちなみにOS X 10.8.2 Mountain Lion。 $ brew upgrade readline $ brew link readline $ brew upgrade openssl $ bre…

has_one, has_many, belongs_toでconditionsを動的にする

Rails has_many with dynamic conditionsより、ActiveRecord 3.1+ではprocを使う必要があるみたい。3.2.8で確認済み。 class User has_many :pictures has_one :profile_picture, class_name: "Picture", foreign_key: "user_id", conditions: proc { ["id =…

ruby 2.0.0-preview1を入れてみる(失敗中)

ruby-installの一覧を更新したあとで、rbenvで2.0.0を入れたらopensslがrequireできない を見ながらチャレンジ。 $ brew upgrade openssl Error: openssl-1.0.1c already installed $ CONFIGURE_OPTS=--with-openssl-dir=`brew --prefix openssl` rbenv inst…

rbenv install(ruby-build)の一覧の更新

rbenvのプラグインとしてインストールしている場合、 $ cd ~/.rbenv/plugins/ruby-build $ git pull $ rbenv rehash Homebrewで入れている場合、 $ brew upgrade ruby-build ただしこちらは更新が遅いので、横着してHomebrewで入れるよりもrbenvのプラグイン…

gemのディレクトリに移動する

$ cd $(dirname `gem which active_record`)

Enumerable#zipってなんぞ

レシーバと引数で与えられた配列を、レシーバの要素数個の配列に分割する。 (複数の配列の要素を、そのインデックスごとに取り分けた配列を作る、のほうが的確?) a = [1, 2, 3] b = [4, 5, 6] c = [7, 8, 9] a.zip #=> [[1], [2], [3]] a.zip(b) #=> [[1,…

Hash[]ってなんぞ

偶数個の引数からハッシュを作る。 Hash[] #=> [] Hash[1] #=> ArgumentError: odd number of arguments for Hash Hash[1,2] #=> { 1 => 2 } Hash[1,2,3,4] #=> { 1 => 2, 3 => 4 } array = [1,2,3,4] Hash[array] #=> {} 最後の一つだけよくわからないなぁ…

schema_plusで外部キー制約をかける

schema_plusを使うとcreate_tableやadd_columnでカラムを定義するときに:referencesオプションにテーブル名を渡すだけで、外部キー制約を手軽にかけることができる。 create_table :posts do |t| t.integer :category_id, references: :categories end 個々…

ActiveRecord::Baseにfindとかfirstっぽいメソッドを生やす。

Rails 3.2.8の話。ActiveRecordは長いのでARと略す。 findやfirstの実装自体はAR::FinderMethodsで定義されていて、それをincludeすることでAR::Relationのインスタンス(user.postsとかUser.scopedの返り値)から使えるようになっている。 module AR::Finde…

rabl、配列を作るときはcollectionよりもnodeを使ったほうが楽なこともある

{ "user": { "id": 1, "name": "John Smith", "posts": [ { "id": 1, "title": "Hitchin' Ride" ] } } というJSONを作りたいとき、"posts"が配列だからcollectionでも使えばいいのかなと思ったけど、どうにもうまくいかなかった。結局nodeを使うのが楽だった…

rablで各エンドポイントに共通のノードをルートに生やす

【追記】とても微妙。要検証 言葉で説明しづらいので、例を示す。APIが次のようなJSONを返すとする。 { "note": { "text": "補足情報" }, "user": { "id": ユーザのID, "name": "ユーザー名" } } ここで "note"はAPIの各エンドポイントで共通のノードなので…

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。