railsノートactiverecord 1
3516 ワード
railsノートactiverecord
modelのプロパティ(性質が変化している場合)を変更した後、奇妙なエラーを避けるために再起動したほうがいいです.
自動タイプ変換:
1 decimalからrubyへのfloat演算後精度可能_保証できません2データはbooleanの特殊な点を示す:Booleanはmodelobjを処理する.name1? railsのbooleanにアクセスするには、rubyに内蔵された低エネルギーbooleanと比較します.
义齿
ModelClass.columns.map{|col|col.name}column ModelClassを表示します.columns_hashはカラム情報を返すhash
データへのアクセス
objectを使用します.propertyアクセスは、object[:property]を使用してアクセスすることもできます(rubyと単語が競合している場合)後者は、デフォルトの動作を上書きするために使用することもできます.たとえば、
class Account < ActiveRecord::Base
def balance=(value)
raise BalanceTooLow if value < MINIMUM_LEVEL
self[:balance] = value
end
end
modelobj 1を追加する.name1_before_type_castは元のデータオブジェクト(変換されていない)を得ることができます.
serialize :last_FiveはYAMLを使用して任意のオブジェクトをTEXTフィールドにシーケンス化できますが、YAMLを識別するプログラムのみが読み込むことができます.
set_primary_key 'another_column'はrailsをanotherに従わせることができますcolumnはidの場合に使用されますが、オブジェクトレベルでアクセスするにはidプロパティが使用されます(another_columnにマッピングされます).
establish_の使用Connectionメソッドは、構成とは異なるデータベースに接続できます.メソッドで無視されているパラメータは、構成からデフォルト値を読み出すか
オブジェクトアクション
作成
newはメモリの中で、saveは後でやっとデータの苦しみに着きますOrder.new do |o| ... o.save end
createは一歩で終わり、1つのhashとhashの配列を受け入れて複数を作成し、order=Orderなどの作成した配列を返すことができます.create(params)(httpから直接パラメータを持って作成)
find検索
findがサポートするパラメータ
join指令、あまり使わないかも???
LineItem.find(:all, :conditions => "pr.title = 'Programming Ruby'", :joins => "as li inner join products as pr on li.product_id = pr.id")
Order.count(サポートされているパラメータと:condition類似)はレコード数を取得できます.
デフォルトではidに従ってfindは異常を報告しませんが、自分の複雑なfindは空のレコード(nil or[])ObjectAを返すだけです.find_by_sqlはフリーフィルObjectAを生成できますが、変更する場合はload idを忘れないでください.
find_(all)_by_A_and_B(a,b)(andのみサポート)はfind(:first(:all)::conditions=>'A=?and B=?',a,b)
reload再読み込み
取引
railsではtrasactionが実現され、trasaction(obj 1,objec 2)で呼び出すと自動的にrollbackメモリの中のオブジェクトが呼び出されます
railsに組み込まれたsave、deleteメソッド(複数のsqlをもたらす可能性がある)はデフォルトでトランザクション(原子)であり、トランザクションを追加する必要はありません.
railsはデータベース間トランザクション(少なくとも現在)をサポートしていません.次の簡単なシミュレーションスキームがあります.
User.transaction(user) do
Account.transaction(account) do
account.calculate_fees
user.date_fees_last_calculated = Time.now
user.save
account.save
end
end
ただしこれはシミュレーションにすぎず,実行期間エラーであればロールバックできるが,user commitの場合エラーであれば内部のaccountはcommit済みでロールバックできない.