大江戸Ruby会議03で飯食ってる時に、

@hrysd「Lokka、Organizationにしたらどうですか?」

@komagata「Organizationアカウント?良いねえ、オシャレだねえ」

ということでLokkaのOrganizationアカウント作ってそっちへ移行しました。

lokka (lokka)

今までCollaboratorだった方を後で追加しておきます。

先々週ぐらいから復活してLokkathonやってますが今はもっぱらDatamapperからActiveRecordへの移行をactive-recordブランチでやってます。

ruby2.0.0-p0にしたらテストが通らなくなって、Datamapper関係で引っかかってるんですが、Datamapperはdatamapper2がもう出ちゃってるし、これメンテするのダルいぁと思ってたところに@hrsydがActiveRecordで大体動くbranchを作ってたのでそれに乗っかりました。あとtestを76個ぐらい通せば移行できそうです。


$ brew upgrade ruby-build
$ rbenv install 2.0.0-p0
$ rbenv global 2.0.0-p0
$ brew install curl-ca-bundle
$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
$ gem install bundler rbenv-rehash

Rails Best PracticesのLaw of demeterを直してる時に結構出てくる。

class Award < ActiveRecord::Base
  belongs_to :story
  delegate :user, :user_name, to: :story, prefix: true
end

class Story < ActiveRecord::Base
  belongs_to :user
  delegate :name, to: :user, prefix: true
  
  has_many :awards
end

class User < ActiveRecord::Base
  has_many :stories
end
>> Award.find(1).story_user_name # => "komagata"

これは分かりやすくなってる!・・・のかな・・・。

starseekerのフィード見てて、

・・・えっ?

・・・え?・・・・え!?

・・・・・・・・・・・・・・・・。

RailsでDBのデータ変更はどこに書く? - komagataの続き。

コメント欄やFacebook、Twitterなどで色々教えていただきありがとうございます!

ちょっとFBの過去ログ見つからないんですが確か@kdmsnrさんが

「Rails Wayにseed.rbではdelete_allしろと書いてあった」

と仰ってました。

つまり、rake db:seedはproductionで毎回実行する。リエントラントに書くってことですな。

自分のプロジェクト(怖話)でも、今までInsertSeedMigrationみたいに書いてたのをrakeタスクとseedに移すように書きなおしてます。

どういう時に何が困ってたのかやっと自分の中でまとまってきたんですが、要は、

「最初の3人のユーザー」とか「最初の10件のPOST」とか「productionで後々増えていくデータの初期データ」をどうするのか?ってことでした。

User.delete_allしてUser.create!をseedに書くとproductionで他のUserが消えちゃうし。seedでif Rails.env.production?する?

Title only.

怖話Andyというユーザー名で登録しようとするとエラー。

Mysql2::Error - Duplicate entry 'Andy' for key 'index_users_on_name'

多分小文字のandyとぶつかってるんだろうな。

validates :name, uniqueness: trueしてるのに何故だろう。mysqlのcollationが変なのになってるのかなと確認してみるも問題無し。

uniquenessを確認している部分のSQLクエリをみてみると・・・

SELECT 1 AS one FROM `users` WHERE `users`.`name` = BINARY 'Andy' LIMIT 1

BINARY・・・だと・・・!?

deviseの設定でcase_insensitive_keysを設定しないとBINARYで確認しにいくようです。

# config/initializers/devise.rb:
config.case_insensitive_keys = [ :email, :name ]

ここにnameも追加してOK。configのコメントぐらいちゃんと読んどけってことですな。

starseeker

「usefulなライブラリを求めてるのにstarseekerを使ってない?」

「ふざけるな!」

「本日より貴様をスノーボール二等兵と呼ぶ」

「いい名前だろ、気に入ったか?」

成人男性の98%が利用してるというstarseeker.soに関して、残念ながら残りの2%に該当してしまった人(もしいるとすれば)にご説明させて頂きます。

starseekerとは

githubで自分がfollowしている人がstarを付けたrepositoryを毎朝メールしてくれるサービスです。

ただ僕はRSSもTwitterも見ない人のものは全く見ない代わりに見ると決めた人はひとつも漏らさず見るスタイル(情報収集スタイルについて - komagata)なので、starseekerもRSSフィードで見てます。

例えば、

moroさんがstarしてるreposは何か実用的でちょこっと便利なやつなんだろうなーとか

junoさんがstarしたのは、俺が知らないなんかおしゃれなgemとかなんだろう、とか

kenchanさんはすごくエッジなライブラリを見つけててすごいな、とか

全く知らなかったclojureを始めた時も、clojureの有名な人をfollowしとけばそこから直ぐに良い人が見つかって広がりました。

ビジネスマンが日経読んでないと上司に怒られる・・・みたいな。これが無い生活は考えられません。

あと、starseeker.so自体もruby2.0.0-p0, rails4beta1, pumaでソースがとても綺麗で参考になりました。

まあ、控えめに言って 神サービス ・・・ ですよね。

#263 Client Side Validations - RailsCasts

modelに定義したvalidationルールを使ってclient sideでもjsでvalidateしてくれるclient_side_validationsは糞便利なんですが、hiddenな要素はvalidateできない。

例えば、user_idがhiddenであって、特定のユーザーをブロックしたい時にはhidden要素もclient_side_validationsでvalidateしたい。

jsを2行書けば済むことなんですが、今後もありそうなのでgemにしました。

komagata/client_side_validations-with_hidden · GitHub
# Gemfile:
gem 'client_side_validations-with_hidden'
// app/assets/javascripts/application.js:
//= require rails.validations
//= require rails.validations.with_hidden

productionのデータ変更処理をmigrationに書くとrails_best_practicesに怒られる。

Rails Best Practices | Isolating Seed Data

怖話のコードで言えば下記の様なもの。

# encoding: utf-8                                                                        
class InsertSeedToSound < ActiveRecord::Migration
  def up
    Sound.create!(id: 1, name: "鳥の鳴き声")
    Sound.create!(id: 2, name: "犬の鳴き声")
    Sound.create!(id: 3, name: "水滴")
    Sound.create!(id: 4, name: "カエルの鳴き声")
    Sound.create!(id: 5, name: "ラジオのチューニング")
  end
    
  def down
    Sound.delete_all
  end
end

僕はmigrationに書いちゃってるけどみんなさんはどうやってますか?

seed.rbに書けっていうけどrake db:seedってリエントラントに書くもの?最初の一回だけじゃないの?

それとも、productionの状態に合わせて過去のmigrationをまとめてseed.rbをそれに合わせて書きなおすみたいなことするのかな?

ちょっと周りのrubyist2名ぐらいに聞いた感じ結論が出なかったので「ふつうこうだよ」っていうのを知ってる方がいたら教えていただけるとありがたいです!(@komagata

追記:

RailsでDBのデータ変更はどこにかく?〜真相編〜 - komagataのブログ