個人的忘備録 AcriveRecordのfindメソッドでjoinsを用いて取得したデータを更新しようとすると以下のようなエラーが出た。 ActiveRecord::ReadOnlyRecord ( ゚Д゚)ハァ? 読み取り専用に指定したことなど一度もないのになぜ? ちなみにコードはこんな感じ。 def find_by_person(person) group = Group.find(:first, :joins => :person, :conditions => ["groups.status=? AND persons.id=?", Group.status(:private), person.id] ) count = group.persons.size group.update_attribute(:status, :public) if count > 10 end 何や人
EntryとTagというモデルがあって、Entryには複数のTagを付けることができ、あるTagが付いたEntryが複数あるとき。つまり、多対多の関係があるとします。このような場合データベース上は、entriesテーブルとtagsテーブルと、その関連を記録するtaggingsテーブルを用意しますね。taggingsテーブルに対応するtaggingモデルを用意します。 で、モデルを定義する時に、has_many :throughを使うと便利。 class Entry < ActiveRecord::Base has_many :taggings has_many :tags, :through=>:taggings end class Tag < ActiveRecord::Base has_many :taggings has_many :entries, :through=>:taggi
今やってる RailsWorkShopの課題では、テーブルが多対多の関連を持っていいます。このへんの知識は無かったので、昨日、じっくりと学習してみました。 課題のテーブル構造 events: 出来事 tags: 出来事に付けるタグ taggings: 出来事とダグの関連(交差テーブル) RailsのActiveRecordは多対多関連も扱えますが、2つの方法があります。 1. has_and_belongs_to_many (略して habtm) この方式では交差テーブルの面倒は全てActiveRecordが見てくれます。ただし、交差テーブルには2つのテーブルのid以外のカラムは持てません。単純に多対多を実現した場合はこの方式は便利です。 2. has_many :throw この方式は交差テーブルを介して一対多のテーブルがあるような扱いで、交差テーブルを介しての参照(select,
Nested AttributesとNested Model Formsを使って親子オブジェクトを一括で登録/変更するには Railsでは、親子構造のオブジェクトのパラメータを一回のリクエストで送り、親オブジェクトを通じて子オブジェクトのCRUDを同時に行わせることが簡単にできませんでした。Rails2.3では、これを簡単に行えるNested AttributesとNested Model Formsの機能が入りました。 まず、モデルクラス側では、以下のように accept_nested_attributes_for を記述します。 # 料理レシピクラス class CookingRecipe すると、この親モデルクラス(上記の例ではCookingRecipe)のオブジェクトには、ingredientsのためのデータを属性の一種としてハッシュで渡すことができるようになります。こ
Active Recordのバリデーションとコールバック(Active Record Validations and Callbacks) † このガイドでは、Active Record オブジェクトのライフサイクルへのフックの掛け方を教えます。 データベースに保存される前にオブジェクトの状態を検証をする方法と、 ライフサイクルの特定の時点でカスタム操作を実行する方法を学べるでしょう。 このガイドを読んで、提示された概念を試した後、以下のことが出来るようになっていることを望みます: Active Record のオブジェクトのライフサイクルの理解。 組み込みの Active Record のバリデーションヘルパの使用。 カスタムバリデーションメソッドの作成。 バリデーションのプロセスによって生成されたエラーメッセージの動作。 オブジェクトのライフサイクル内のイベントに応答するコール
モデルが参照するテーブルのレコードで、存在しないidものにアクセスしようとすると、その戻り値がfindとfind_by_idで違うことについて。 dataテーブルのidカラムが1~9まで埋まっているものとしよう。 このとき、id = 5のものにアクセスしようとすると、 Data.find(5) # => datasテーブルの5番目のDataモデルインスタンス Data.find_by_id(5) # => datasテーブルの5番目のDataモデルインスタンス Data.find(5) == Data.find_by_id(5) # => true 同じものが返ってきます。 一方、id = 10のデータにアクセスしようとすると、そんなインスタンスはなく、 Data.find(10) # => # ActiveRecordNotFound Data.find_by_id(10) # => n
新しいブログをはじめました! ブログ名:筋肉カメレオン WordpressやAWS、時々筋トレについて書いてます。 Railsでデータをfindする時、該当件数が0件の時は、ActiveRecord::RecordNotFoundな例外になってしまうので、 rescue ActiveRecord::RecordNotFoundで例外処理をしなくてはならない。 これがずっと面倒だなぁとおもってたら、なんとfind_by_idを使えば、nilが返るので user = User.find_by_id(params[:id]) unless user then # 0件のときの処理 endと使えるらしい!! これからは、find_by_*** を使います。。。 追記 http://blogs.yahoo.co.jp/killer2kmonday/16884102.html おっと、ココ見たら、fi
find(id) に find_by_id(id) の挙動を期待していたので以下のようなコードを書いてしまっていた。 @item = Item.find(params[:id]) if params[:id] render(:nothing => true, :status => '404 Not Found') unless @item これだとレコードが見つからなかったときにサーバーエラー(ステータスコード 500)になってしまう。 そうならないためには以下のコードが正しい。 @item = Item.find_by_id(params[:id]) if params[:id] render(:nothing => true, :status => '404 Not Found') unless @item 奥が深い。 参考 ActiveRecord のお勉強 – Rails で行こう
RailsのActiveRecordのお話です。 recordを新しく作成する時にだけかけたいvalidationがあったり、更新する時にだけかけたいvalidationがあった経験はありませんか? そんな時、ActiveRecordはとってもお利口さん。 対象のクラスにおいて、魔法のメソッド「validate_on_create」「validate_on_update」メソッドを定義してあげると、上記を実現できます。 例えば、以下のような状況設定とする。 Studentテーブル └ 作成するときだけ、パスワード(password)を確実に登録してもらう。 └ 更新する時だけ、年齢(old)を入力してもらう。 実現方法は多数ありますが、代表的なものを2つほど紹介します。 実現方法1 class Student < ActiveRecord::Base validates_presence_
先日うちの開発メンバーから新人さんに共有があったんですが、 saveとsave!の振る舞いの違いなどについてまとめておきます。 当然のことながら、ActiveRecordでは、モデルオブジェクトの値を変更、保存、削除することができ、対応するレコードの内容を更新することができます。属性の値を変更、保存するメソッドはたくさんありますが、自分が使うところで以下一例です。 save、save!、create、create!、update、update_all、update_attribute、update_attributes、update_attributes!、destroy、destroy_all、delete、delete_allActiveRecord::Baseを継承したモデルオブジェクトの属性の変更について、ぽちぽちまとめてみようかなとは思いますが、とりあえず、話に上がったsaveと
前回はActiveRecordを使った参照について解説しましたが、今回は登録、更新、削除などの更新系を中心に見ていきます。 前回の記事では、Ruby on Railsのモデル層を担当するActiveRecordの概要と参照系の操作について解説しました。今回は、登録、更新、削除などの更新系の機能を中心に見ていきます。 登録・更新の際には、モデルに不正な値が保存されないようにデータをチェックして、問題があれば保存しないようにする「検証」(Validation)の仕組みが走ります。この検証機能の背後には、ActiveRecordのコールバックという仕組みがあります。コールバックを使うことで、登録、更新、検証、削除処理の前後に様々な処理を追加できます。今回と次回の2回にわたって、ActiveRecordの更新系操作のやり方とともに、検証、コールバックについて詳しく解説していきます。また、検証メッセ
This feature is scheduled for: Rails v2.3 We were all teased a few months ago about the possibility of finally solving the nested model/complex forms problem in Rails, but were then cruelly notified that it wasn’t quite ready for prime time. But our day has come – the most requested feature for Rails 2.3, the ability to handle multiple models in a single form, is here. This API update was added af
以前に書いたコードを読んでいると、1カラムの値だけを変えるからといって、update_attribute メソッドを使っている部分があった。これはあまりよくない update_attribute とupdate_attribtues の違い 前者は1つのカラムの値を、後者は複数のカラムの値を更新できる。という違い以上に、「update_attribute メソッドはvalidation なしに更新、update_attributes メソッドはvalidation ありで更新」という違いがあります。 つまり、update_attribute 使うと、検証処理なしに、値が更新されてしまう。ソースを見ると、update_attribute の方は、save(false) を使って更新しているのが分かる。 activerecord/lib/active_record/base.rb at mas
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く