rbenv version ~~ is not installed となったとき
rbenv: version `2.1.0' is not installed
が出た時の対処法
rbenv install 2.1.0
でOK!
ちな、このあと
rake aborted!
cannot load such file -- bundler/setup
っていうエラー出たんだけど、
を参考にして、なんとかなった
gem install bundler
機械学習とかでPythonを取りあえず使いたい!って人のためのチートシート
リスト
sales = [33,24,67,34]
print len(sales) #4
print sales[2] #67
存在チェック
print 24 in sales #true
print range(10) #=>0から1の配列を返す
print range(3,10,2) #=>3から始まる、2とばしの10以下の配列
並べ替え
sales.reverse #=>単に要素の順番を逆にする
sales.sort #=>小さい順に並ぶ
大きい順に並べるには sales.sort.reverse
文字列をリストに split
d = "2013/12/15"
print d.split("/") #=> ["2913","12","13"]
リストを文字列に join
a = ["a","b","c"]
print "-".join(a) #=> a-b-c
タプル(変更できない) ()
a = (2,5,8)
リストと同じようにlenとかメソッド使える
print len(a) #3
print a * 3 #(2,5,8,2,5,8,2,5,8)
セット(集合型,重複を許さない) ([])
a = set([1,2,3,4,1])
print a #=> [1,2,3,4] 1が無視される、重複なので
集合の計算ができる
a = set([3,4,5])
和集合を出してみよう
print a | b #=> [1,2,3,4,5]
辞書型データ {}
keyとvalueがセットになったもの
sales = {"shiho": 100, "yamada":50}
print sales["shiho"]
中身を変えるには
sales["shiho"] = 900
keyが存在するか
"shiho" in sales #true
キーの一覧
sales.keys()
valueの一覧
sales.values()
キーもvalueも
sales.items()
条件分岐
if
score = 70
if score > 60 :
print "OK"
繰り返し
for
sales = [23,45,266]
sum = 0
for sale in sales:
print sale
sum += sale
else:
print sum
elseというのは、ループが終わった時の処理を指す!
for i in range(10) で0から10までやってくれる
if i == 3:
continue(3をスルー) / break(3でブレイク, 0,1,2だけ)
辞書型のデータで繰り返し
sales = {"shiho": 100, "yamada":50}
for key, value in sales.iteritems():
print "key: %s value: %d" % (key,value)
while
n = 0
while n < 10:
n += 1
print n
else:
print "end"
関数を使ってみる
def hello(name)
print "hello %s" % name
#実行
hello("yoko")
リストのそれぞれの要素に関数の処理をやらせる map
def double(x)
return x * x #二乗させる関数
map(double, [2,5,8]) #map(関数, リスト)
無名関数 lamda
print map(lamda x: x*x, [2,5,8])
#=> [4,25,64]
オブジェクト (変数と関数をまとめたもの)
クラス:オブジェクトの設計図
インスタンス:クラスを実体化したもの
class User(object):
def __init__(self, name)
self.name = name
def greet(self):
print "my name is %s" % self.name
shiho = User("shiho")
print shiho.name
print shiho.greet()
スライスを使った文字列, リストの取得 :
インデックス
- 文字列オブジェクト[開始インデックス: 終了インデックス]
0 1 2 3 4 5
| A | B | C | D | E |
#文字
str = "ABCDE"
slice = str[1:3] #"BC"
slice = str[1:-1] #"BCD"
#終了インデックスを省略すると、自動的に最後の文字の次のインデックスが指定されたことになる
slice = str[1:] #BCDE
# 参考 http://www.pythonweb.jp/tutorial/string/index11.html
Polymorphicなモデル&それに対応したネストしたフォームを作る!
そもそもpolymorphicとはなにか。
例えばユーザーと商品がそれぞれ画像を持つときの、画像モデル。いちいちユーザ画像モデルと商品画像モデルを作るのは二度手間な気がする...。
そんなときPolymorphicにすると、ユーザモデルと商品モデルそれぞれに画像モデルを従属(belongs_toの関係)させることができる。
画像モデルはユーザの子でもあり、商品の子でもある。つまり、@user.imagesも@product.imageもできてしまうのだ。
-----------------------------
class User < ActiveRecord::Base
has_many :images, :as=> :imageable #imageableという名前で親モデル(User)を抽象化している。
class Product < ActiveRecord::Base
has_one :image, :as => :imageable #imageableという名前で親モデル(Product)を抽象化している。
class Image < AcriveRecord::Base
belongs_to :imageable, :polymorphic => :true #抽象化された親モデル(imageable)に従属している。
-----------------------------
さてしかしこれだけだと、Images データベースに値が入って、ProductなのかUserなのかわからないということが起こりうる。
なので、imagesDBに
imageable_type #=> ProductかUserかを判別するため。今回は"Product"か"User"の文字列を入れる
imageable_id #=> productかuserのIDを入れる。
という2つのカラムを足す。
これでモデルの関係を示す記述が完成した。
次はこのモデル関係に対応して、商品のDBと画像のDB両方に一気にレコードを入れるフォームを作る。
ネストしたフォーム(この場合は商品フォームの中に画像フォーム)を作る場合は、accepts_nested_attributes_forをモデルに追加する。
------------------------------------
class Product < ActiveRecord::Base
has_one :image, :as => :imageable
accepts_nested_attributes_for :image
end
-------------------------------------
これで何ができるかというと、viewで
-------------------------------------
<%= form_for @product do |p| %>
<%=p. text_field :name %>
・・・
<%=p.fields_for :image, @product.image || Image.new do |i| %> #=>ネストした画像フォーム
<% if @product.image.present? %>
<%= image_tag @product.image.image.url %>
<% end %>
<br/>
<%= i.label :image %>
<%= i.file_field :image %>
<%= i.hidden_field :imageable_type, value: "Product" %>
<%= i.hidden_field :imageable_id, value: @product.id %>
<% end %>
・・・
-------------------------------------
パラメータはどうなるのかというと、
iamge_attributes の中に imageとか、imageable_typeとかが詰まっている形になるので、
-------------------------------------
params.require(:product).permit(:name,....., :image_attributes => [:image, :imageable_type, :imageable_id, ...])
-------------------------------------
でとれる。