Convert an enumerable to a hash, using the block result as the key and the element as the value. people.index_by(&:login) # => { "nextangle" => <Person ...>, "chade-" => <Person ...>, ...} people.index_by { |person| "#{person.first_name} #{person.last_name}" } # => { "Chade- Fowlersburg-e" => <Person ...>, "David Heinemeier Hansson" => <Person ...>, ...}
あるテーブルに対して複数のレコードを同時に登録したいことがあります。 このときに登録する数だけINSERTを発行するのはあまり効率がよくありません。 そこでBULK INSERTと言われる単発のSQLで一括登録する方法がよく使われます。 BULK INSERTとは 単純なbooksというテーブルを使い、BULK INSERTはどういうものか確認する。 CREATE TABLE `books` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAU
Active Support Concern A typical module looks like this: module M def self.included(base) base.extend ClassMethods base.class_eval do scope :disabled, -> { where(disabled: true) } end end module ClassMethods ... end end By using ActiveSupport::Concern the above module could instead be written as: require "active_support/concern" module M extend ActiveSupport::Concern included do scope :disabled, -
自分のプロジェクトで使う gem はこれですので、すべからくインストールすべし!ということを指定できるようになりました。 まあ、gem 依存については私も大層な知識がないのでorz、頼みの rails-2.1.0/CHANGELOG ファイルを見ながらこの記事を書いてみようかなと思います。 config/environment.rb Rails::Initializer.run do |config| # bj という名前の gem パッケージが必要 config.gem "bj" # hpricot という名前で、バージョンが0.6でリポジトリが http://code.whytheluckystiff.net の gem パッケージが必要 config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluc
Active Recordで以下のようにcountを実行しても、複数列の値が取得できません。 Message.count(:group => "rcv_user_id, send_user_id") =>[[ 3, 2] , [ 4, 2]] ※一番最後に指定した列の値+行数 このような場合には、countを使わず、通常のfindを使用します。 Message.find(:all , :select => "count(*) count, rcv_user_id, send_user_id":group => "rcv_user_id, send_user_id") 結果をオブジェクト(インスタンス)から取得するときにも、countやメソッド名で取得できるので、ソースの可読性が良くなります。 もう、count使わないほうが良いカナと思ってしまいます。
Using “try” with a hash to check existence of a key The try method is awesome. Check the documentation. It is usually used to call a method on an object if it exists, or return nil if it doesn’t. But sometimes, it is not used with hashes, but this also works perfectly: params[:search] ? params[:search][:name] : nil # Can also be written as... params[:search].try(:[],:name)
ActiveRecordオブジェクトは, class Employee < ActiveRecord::Base end とするだけで,上記で言えばemployees表が持つ各種列に対応する属性が利用可能になる。例えば,employees表にname列が定義されていたとすれば, employee.name = ‘Yoichiro’ p employee.name というように,nameアクセッサを利用することができる。とても簡単だ。では, employee.name? とemployeeオブジェクトにメッセージを投げることが可能である人は,どれだけいるだろうか?もちろん僕も,rails-mlに「 [rails:2302] ActiveRecordオブジェクトの属性にクエスチョンをつけると・・・?」という投稿があるまで,知らなかった。 では,「#{attr_name}?」で問い合わせた場合,
ちょっと前に話題になったRSpecのスライドがステキだったよね。でもRSpecはまだまだ底知れない気がするので自分でもいろいろと調べてみようと思った次第。 まずはrspec-core(2.5.1)/features/example_groups/shared_example_group.featureを参考にshared example groupについて調べてみたよ。 例1:テストを共有できる require "set" shared_examples_for 'a collection' do subject { described_class.new [7, 2, 4] } its(:size) { should eq 3 } it { should include 7 } it { should_not include 9 } end describe Array do it_be
The ability to track whether or not your active record objects have been modified or not becomes a lot easier with the new dirty object functionality of edge rails. It’s dead simple, and pretty slick, to use: article = Article.find(:first) article.changed? #=> false # Track changes to individual attributes with # attr_name_changed? accessor article.title #=> "Title" article.title = "New Title" art
● [rails] Validations ある ActiveRecord オブジェクトの内部状態が期待する値かどうかを検査するのがvalidation 機能です。例えば、ある変数(状態)が、空値、決まった範囲、特定の正規表現にマッチ、であるかどうかといった検査を定義します。定義するには、ActiveRecord::Base#validate を override します。validate_on_create や validate_on_update などに関しても同様です。 validate_on_create: オブジェクトが新規に作成されたときにのみ実行されます validate_on_update: オブジェクトが更新されたときのみ実行されます validate: 新規・更新のどちらの場合でも実行されます validate と validate_on_* の両方が定義された場合は、
『るびま』は、Ruby に関する技術記事はもちろんのこと、Rubyist へのインタビューやエッセイ、その他をお届けするウェブ雑誌です。 Rubyist Magazine について 『Rubyist Magazine』、略して『るびま』は、日本 Ruby の会の有志による Rubyist の Rubyist による、Rubyist とそうでない人のためのウェブ雑誌です。 最新号 Rubyist Magazine 0058 号 バックナンバー Rubyist Magazine 0058 号 RubyKaigi 2018 直前特集号 Rubyist Magazine 0057 号 RubyKaigi 2017 直前特集号 Rubyist Magazine 0056 号 Rubyist Magazine 0055 号 Rubyist Magazine 0054 号 東京 Ruby 会議 11 直
テストを書いていると、こんな風にTimeオブジェクト同士を比較する時があります。 assert @user.save assert_equal Time.now, @user.reload.updated_at まぁ、updated_atはrails側でもテストしているのでやる方はあまりいないかもしれませんが、自分でも「evaluated_at」とかを作ることもあるんで、こういうテストも結構多いのでは。 Timeオブジェクト同士の比較のテストで落ちることが多い 多いのはこれ。 <Wed May 21 01:20:15 +0900 2008> expected but was <Wed May 21 01:20:16 +0900 2008>. 1秒差で落ちる。 解決策 Time.freeze_timeを使おう! freeze.rb http://funny-code.googlecode.c
ActiveSupport による Date, Time クラスの拡張まとめ。バージョンは 2.0.2 準拠。ソースを読んで script/console で動作確認を行っています。 相互置換 Date でも Time でも、それぞれ to_time および to_date で相互に置換できます。 必要であれば to_datetime で DateTime 型への変換も可能です。 to_s の拡張 to_s に引数をつける事で、所定の形式で出力してくれます。 Time.now.to_s(:db) => "2008-2-23 17:49:29" 引数と出力の対応は以下のとおり。 Time 引数出力 :db%Y-%m-%d %H:%M:%S :time%H:%M :short%d %b %H:%M :long%B %d, %Y %H:%M :long_ordinallambda { |time
けっこう昔からあるのに割と最近知ったRailsの便利ヘルパー。 書式は以下の通り。 cycle(first_value, *values) 呼び出されるたびに与えられた順番に引数の文字列を出力する。 テーブルをストライプにするためにのコード例 まずはcycleを使わないで書いたコード。 <table> <% @items.each_with_index do |item, i| %> <% if i % 2 == 0 %> <tr style="background-color:#fff;"> <% else %> <tr style="background-color:#ccf;"> <% end %> <td><%= item.name -%></td> </tr> <% end %> </table> これがcycleを使うと次のように簡単に書ける。 <table> <% @item
● pagination (簡単なページ管理) Webコンテンツで一覧表示時に「前のページ」「次のページ」といったリンクを作るのは結構面倒であるが、Rails には pagination というページ管理機能がある。ロジック(コントローラ)側では、テーブルのモデルを表すシンボル(必須)と表示条件等を引数に取りpaginate を呼び出すだけ。 # controller def list @pages, @items = paginate(:item, :per_page => 20, :order_by => 'itemcode') end 戻り値はページ管理オブジェクトと検索結果のモデルのインスタンスの配列。後者はAR::find_allと同じものであり、前者のページ管理オブジェクトがページに関する各種情報を持っているので、ビュー側ではそれを以下のように利用する。 # view <%=
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く