Edo::World::Blog

〜Linux/Solaris関連の作業メモ〜

Ruby

[Ruby] Active Record

作成中

Rail4ではfindは廃止

http://railsdoc.com/references/find

rails3からrails4で大きく変更があったメソッドの一つ。

find(:all)やfind(:all, :conditions ...)などの書き方が廃止になりました。whereなどを使うようにしてください。

※AREL(https://github.com/rails/arel#readme)が導入されたによる影響。ActiveRecordのfindが使えなくなった訳ではない。

where

Model.where("id = ?", 10).first
# 複数指定する場合は配列を使用
Model.where("id IN (?)", [10, 20])
# joinがある場合
Model.where("models.id = ?", 10).first
Model.where("models.id IN (?)", [10, 20])

参考:http://ryopeko.hatenablog.com/entry/20101215/1292373612


Arelで組み立てたSQLをfind_by_sqlで実行

http://d.hatena.ne.jp/takihiro/20100923/1285215139

sql = model.project(config[:id]).where(config[:name].eq('hoge')).to_sql
Model.find_by_sql(sql)

pluckメソッド

puts Model.pluck(:id)  # "puts T_config_file.select(:id).map(&:id)"と同価


sqlを表示

puts Model.pluck(:id).to_sql #=> SELECT `models`.`id` FROM `models`

[explain]

puts Model.pluck(:id).explain


distinctはuniqを使用

Client.select('DISTINCT name')
# 以下も同じ動作
Client.select(:name).uniq


find

# id列、name列を表示
Model.find(:all, :select => "id, name")

[プレースホルダ]

# ex1
Model.find(:all, :conditions => ["id = ? and name = ?", params[:id], params[:name]])
# ex2
Model.find(:all, :conditions => ["id = :id and name = :name", {:id => params[:id], :name => params[:name]}])


find_by_

result = Model.find_all_by_id(1)
result.to_a.each do |p|
  puts p[:id]
end


find_by_sql

sql = "select * from models where id = ? and name = ?"
id = 1
name = 'foo'
Model.find_by_sql([sql, id, name])

cond = Hash.new
sql = "select * from models where id = :id and name = :name"
cond[:id] = 1
cond[:name] = 'foo'
Model.find_by_sql([sql, cond])


テーブル定義を表示

# カラム数を表示
puts Model.columns.size  #=>4
# カラム名を表示
puts Model.columns.map { |e| e.name }
["id", "name", "tel", "mail"]
# 属性を表示
puts Model.columns.map { |e| e.sql_type }
["int(10)", "varchar(30)", "int(10)", "int(10)"]

[Ruby] mysql2のgemインストールに失敗(mac(10.8.5)/mysql56(macports)環境)

解決=>mac(10.8.5)/mysql56(macports)環境でmysql2のgemインストールに失敗

続きを読む

[Ruby] csvファイルの処理

Ruby標準添付のcsvライブラリを使用

続きを読む

[Ruby] 配列内の値の出現回数をカウント

重複の有無を確認

1ならば全て重複した値

arr.uniq.size

重複数をカウント

参照元:http://takuya-1st.hatenablog.jp/entry/20100103/1262486833

arr = [1,2,3]
arr.size - arr.uniq.size   # => 0  重複無しの場合は0を返す
arr = [1,2,3,1,2]
arr.size - arr.uniq.size   # => 2  2つの文字が重複した状態
arr = [1,2,3]
arr_2 = [1,2,3,1,2]
(arr - arr_2).empty?   #=> true

arr = [1,2,3,4]
(arr - arr_2).empty?   # => false
arr - arr_2          # => 4
(arr_2 - arr).empty?    #=> true


[より効率的な方法]

arr.uniq.select{|i| arr.index(i) != a.rindex(i)}

ハッシュにして返す

class Array
  def count
    k = Hash.new(0)
    self.each{|x| k[x] += 1 }
    return k
  end
end

arr = %w{ foo bar baz foo baz }
items = arr.count
puts items  #=> {"foo"=>2, "bar"=>1, "baz"=>2}

items.each do |k, v|
  puts "#{k} : #{v}"
end
# =>
# foo : 2
# bar : 1
# baz : 2

puts items.keys
# =>
# foo
# bar
# baz

[Ruby] chef-solo その3(ohai)

続きを読む
プロフィール

edworld

記事検索
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

  • ライブドアブログ