無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

ActiveRecordで検索

ActiveRecord::Base#find でテーブルからデータを検索できます。
引数に応じて以下の検索が可能です。

  • IDで検索
  • 条件にマッチする最初のデータを検索
  • 条件にマッチするすべてのデータを検索

データ

テーブル定義:

CREATE TABLE kittens (
  id int(11) NOT NULL auto_increment PRIMARY KEY,
  name VARCHAR(255),
  color VARCHAR(255),
  age int(4)
);

データ:

mysql> select * from kittens;
+----+-------+-------+------+
| id | name  | color | age  |
+----+-------+-------+------+
|  1 | mii   | gray  |    1 |
|  2 | tora  | brown |    2 |
|  3 | kuro  | black |    1 |
|  4 | shiro | white |    3 |
+----+-------+-------+------+
4 rows in set (0.00 sec)

IDで検索

findの引数にIDやをIDの配列を指定すると、「IDで検索」となります。

サンプル:

class Kitten < ActiveRecord::Base
  def to_s
    return name
  end
end

# IDを1つ指定して取得。戻り値はKitten
puts Kitten.find(1)

# IDを複数指定して取得。戻り値はKittenの配列
puts Kitten.find(1, 3).join(",")
puts Kitten.find([2, 4]).join(",")

# ID + 検索条件を指定(APIドキュメントに記載があったが、いつ使うのかよくわからない・・)
puts Kitten.find(1, :conditions=>"age = 1")

# ID + 検索条件を指定
# 該当するデータが無いため、RecordNotFoundのエラーとなる
puts Kitten.find(1, :conditions=>"age = 2")

出力:

mii
mii,kuro
tora,shiro
mii
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1031:in `find_one': Couldn't find Kitten with ID=1 AND (age = 2) (ActiveRecord::RecordNotFound)
	from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1014:in `find_from_ids'
	from /usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:419:in `find'
	...

条件にマッチする最初のデータを検索

引数に「:first」を指定すると、条件にマッチする最初のデータを検索します。

サンプル:

# 最初のデータを取得。戻り値はKitten
puts Kitten.find(:first)

# 検索条件付きで最初のデータを取得
puts Kitten.find(:first, :conditions=> "age = 1" )
puts Kitten.find(:first, :conditions=> "color = 'brown'" )

# ソート条件付きで最初のデータを取得
puts Kitten.find(:first, :order=> "age DESC" )
puts Kitten.find(:first, :order=> "age ASC" )

# 取得位置を指定,
# shiro,tora,mii,kuro の順にソート後、2番目以降の最初のデータを返す。
puts Kitten.find(:first, :order=> "age DESC", :offset=>1 )

# 条件にマッチするデータがない。nilが返される。
puts Kitten.find(:first, :conditions=> "age = 10" )

出力:

mii
mii
tora
shiro
mii
tora
nil

条件にマッチするすべてのデータを検索

引数に「:all」を指定すると、条件にマッチするすべてのデータを検索します。

サンプル:

# 全のデータを取得。戻り値はKittenの配列
puts Kitten.find(:all).join(",")
puts "---"

# 検索条件にマッチするすべてのデータを取得
puts Kitten.find(:all, :conditions=> "age = 1" ).join(",")
puts Kitten.find(:all, :conditions=> "color = 'brown'" ).join(",")
puts "---"

# ソート条件付き
puts Kitten.find(:all, :order=> "age DESC" ).join(",")
puts Kitten.find(:all, :order=> "age ASC" ).join(",")
puts "---"

# 取得位置/取得数を指定,
puts Kitten.find(:all, :offset=>1 ).join(",") # 効果がない。すべての一覧が返されてしまう・・。
puts Kitten.find(:all, :limit=>2 ).join(",")
puts Kitten.find(:all, :offset=>1, :limit=>2 ).join(",")
puts "---"

# グループ化
puts Kitten.find(:all, :group=> "age" ).join(",")
puts "---"

# 条件にマッチするデータがない。空の配列が返される。
puts Kitten.find(:all, :conditions=> "age = 10" ).join(",")

出力:

mii,tora,kuro,shiro
---
mii,kuro
tora
---
shiro,tora,mii,kuro
mii,kuro,tora,shiro
---
mii,tora,kuro,shiro
mii,tora
tora,kuro
---
mii,tora,shiro
---

参考:Class ActiveRecord::Base