読者です 読者をやめる 読者になる 読者になる

active record

ActiveRecordでselectしたはずのデータにアクセスできないんです

超はまった。。 priceカラムを持つitemsテーブルがあるとして、商品の日々の価格を記録しているとします。 今日の価格が前日比でどうなったか知るべく、こんな調子のものを書いたとして q = Item.find_by_sql(<<-SQL) select t1.price - t2.price as price_c…

Associationは書けないんだけどINNER JOINしたテーブルのカラムを参照したいんです

たぶんPrimaryKeyじゃないカラムで紐付けあっているテーブルだとbelongs_toとかでAssociationを定義できない?気がしています。試していないんですけど。 そんなときに結合したテーブルのカラムを触りたい場合のやり方を2通り。 ターゲットになるテーブルのA…

ActiveModel::Dirtyのattribute_changed?とかが便利なんです

saveしているはずなのにsaveできないんです! - なんでや。。 上記でも少し触れたActiveModel::Dirtyのchange的なメソッドたちが便利。 ActiverRecord::BaseがActiveRecord::AttributeMethods::Dirtyを、それがActiveModel::Dirtyをincludeしている関係。 Ac…

Arelの集計関数とActiveRecord::FinderMethods#firstの相性が微妙な気がする

何かfirstに対する根本的な誤解をしている気がしなくもなく。。 activerecord (3.1.0) activerecord-oracle_enhanced-adapter (1.4.2) emp = Employee.arel_table q = Employee.select([emp[:manager_id].count.as('cnt')]).order(emp[:manager_id].asc) o =…

ActiveRecordモデルのカスタムバリデーションメソッドを共有したいんです

委譲でなく。エラーはerrorsに書き込みたいから……と考えるとバリデーションの委譲はたぶん面倒臭い。 だからMixinしてやる。こういうやり口ってRailsのベストプラクティスでまとめられていたりしそう。 ruby 1.9.2p290 (2011-07-09) [i386-mingw32] activere…

ActiveRecordで集計関数の結果を複数selectしたいんです

select sum(min_salary), sum(max_salary) from jobs; これをActiveRecordで書きたい。 ベタに書くと rec = Job.select(<<-SELECT).all[0] SUM(MIN_SALARY) AS MIN_SALARY ,SUM(MAX_SALARY) AS MAX_SALARY SELECT # => SELECT SUM(MIN_SALARY) AS MIN_SALARY…

ActiveRecordでINNER JOINしつつEagerLoadingしたいんです

対象の表に対してふつうに.joins()して.includes()すればいいようです。 ruby 1.9.2p290 (2011-07-09) [i386-mingw32] activerecord (3.1.0) activerecord-oracle_enhanced-adapter (1.4.2) railsでinnner joinするクエリを元に一覧表示画面を表示する場合、…

同一項目に同一バリデータによるバリデーションを複数種書きたいんです

max_salaryによってjob_titleのバリデーションを変えたいなあと思った場合、validatesの記述自体を分けて↓こう書けばよい。 class Job < ActiveRecord::Base self.primary_key = :job_id validates :job_title, length: {maximum: 5, if: ->{max_salary <= 1…

attr_accessorにデフォルト値を持たせたいんです

ぐぐると真っ先にattr_accessor_with_defaultが出てくるから使ってみたらundefinedって言われた。。 今はこう書くのが正しい。 class Employee < ActiveRecord::Base attr_accessor :a after_initialize do self.last_name = 'tanaka' self.a = 'ito' end en…

ActiveRecordでサブクエリのIN句を書きたいんです

ruby 1.9.2p290 (2011-07-09) [i386-mingw32] activerecord (3.1.0) activerecord-oracle_enhanced-adapter (1.4.2) IN句自体はバインド変数を配列にすれば勝手にいいようにしてくれるようです。 サブクエリはArelを徹底活用するのがいいようです。“ふつうに…

saveしているはずなのにsaveできないんです!

ruby 1.9.2p290 (2011-07-09) [i386-mingw32] activerecord (3.1.0) activerecord-oracle_enhanced-adapter (1.4.2) Oracle 11g XEのHRスキーマで SQL> select employee_id, first_name from employees where employee_id = 100; EMPLOYEE_ID FIRST_NAME ---…

ActiveRecordのloggerがカラーコードを付加してきて見づらいんです!

ruby 1.9.2p290 (2011-07-09) [i386-mingw32] activerecord (3.1.0) activerecord-oracle_enhanced-adapter (1.4.2) loggerをしこんでActiveRecordのログを見てみる。 require 'logger' ActiveRecord::Base.logger = Logger.new(STDOUT) するってーと D, [20…

Oracle 11g XEのHRスキーマのテーブルをActiveRecordで書いてみる

Oracle 11g XEのHRスキーマのテーブルをActiveRecordで書いてみる ER図はこちら: 表と表クラスタ class Region < ActiveRecord::Base primary_key = :region_id has_many :countries end class Country < ActiveRecord::Base primary_key = :country_id bel…

普通のRubyスクリプトからOracle 11g XEにActiveRecordで繋ぎに行く

必要なgemをインストール PS:Desktop> gem install activerecord-oracle_enhanced-adapter Fetching: activerecord-oracle_enhanced-adapter-1.4.2.gem (100%) Successfully installed activerecord-oracle_enhanced-adapter-1.4.2 1 gem installed Installi…