query: tag:AR

ActiveRecordを読み込んだ状態でirbを使っているときに、TAB補完をしようとすると落ちることが結構な頻度でありました。
原因を調べてみると、補完候補のArrayをsort使用としているところで、Symbolに対して <=> 演算子を呼びだそうとしてエラーが発生しているようです。
補完候補は Object#instance_methods から得ているようなので、なぜSymbolが要素として混入するのかが謎だったのですが、どうやら
Arel::Attribute::Predications クラスが犯人のようです。

ruby>>
PREDICATES = [
:eq, :eq_any, :eq_all, :not_eq, :not_eq_any, :not_eq_all, :lt, :lt_any,
:lt_all, :lteq, :lteq_any, :lteq_all, :gt, :gt_any, :gt_all, :gteq,
:gteq_any, :gteq_all, :matches, :matches_any, :matches_all, :not_matches,
:not_matches_any, :not_matches_all, :in, :in_any, :in_all, :not_in,
:not_in_any, :not_in_all
]

Predications = Class.new do
def self.instance_methods *args
warn "this module is deprecated, please use the PREDICATES constant"
PREDICATES
end
end
<<--

このコードを書いた人は instance_methodsはStringの配列を返すという事を失念していたようですね。
irb/completeはObjectSpaceから補完候補を拾ってくるので、上述のコードがあるせいでSymbolが補完候補配列に混入してしまいます。

回避策としては、irb起動時に以下のようなコードを読み込むなどがあります。

ruby>>
module Arel
class Attribute
class Predications
def self.instance_methods
require 'arel/algebra/attributes/attribute'
Arel::Attribute::PREDICATES.map(&:to_s)
end
end
end
end
<<--

追記

この問題は 1.8.x系のRubyでのみ発生するようです。
thanks
@a_matsuda!

posted by genki genki on Thu 7 Jul 2011 at 12:31 with 0 comments

Gears を使うには

  1. gears_init.js の読み込み
  2. 低レベルAPIを駆使

という面倒な作業が必要になる。

具体的には

html>>

<<--

javascript>>
var db = google.gears.factory.create('beta.database');
db.open("database-demo");
var rs = db.execute("select name from users");
while(rs.isValidRow()) {
name = rs.fieldByName('name');
rs.next();
}
rs.close();
db.close();
<<--

のようなコードが必要になり、今日日こういうのは書きたくない。
そこで、

active_record.js を使う

Aptana が提供してる activejs プロジェクトの ActiveRecord ライブラリを利用すると、以下のようにすっきりする。

html>>

<<--

javascript>>
ActiveRecord.connect(ActiveRecord.Adapters.Gears,'database-demo');
var User = ActiveRecord.create('users', {name:''});
User.create({name:'maiha'});
<<--

RailsのARを忠実にJavaScriptへ移植してあるため、
ARに慣れていればほぼドキュメントなしで使えるのが嬉しい。

javascript>>
maiha = User.findByName('maiha'); // Dynamic Finder
name = maiha.name; // Accessor methods
maiha.name = 'foo';
maiha.save();

User.count();
User.find({all: true, order: 'name'});
<<--

他にも

  • Validation
  • Callback
  • Relation (hasOne, hasMany, belongsTo)
  • Migration

といった機能が実装されており、
ARの移植物としてみても完成度が非常に高い。
ちなみに、js のサイズは compaction なしで200KB程度。

参考

posted by maiha maiha on Mon 19 Oct 2009 at 05:12 with 0 comments

annotate_models
は、テーブルの情報をModelとFixtureのファイルに
コメントとして書き込んでくれる非常に便利なプラグインです。

永く愛用しているプラグインの一つなのですが、
しばらくメンテナンスされていないようなので、
欲しいと思っていたindexに関する情報も出力するようにしてみました。

http://svn.s21g.com/public/rails/plugins/annotate_models_with_index/

こんな感じに、インデックス情報をカラムごとに付加します。

rails>>

== Schema Information

Schema version: 48

Table name: users

id :integer(11) not null, primary key

(* snip *)

mobile_email :string(255) index_users_on_mobile_email(unique)

<<--

posted by genki genki on Thu 24 Jan 2008 at 01:10 with 0 comments

最近は、自分用にRailsの挙動を拡張するために書いた
lib/xxxx_ext.rbが増えてきました。
こういったファイルはconfig/initializer/の直下に
置いても良いのですが、ON/OFFを切り替えやすいので、
config/initializer/libs.rbの中から、require "xxxx_ext"
を呼ぶようにしています。

さて、今回はActiveRecordをさらに便利に使うために、
僕が行っている拡張を紹介します。

lib/active_record_ext.rb

rails>>
module ActiveRecord
class Base
def self.[](arg, *args)
case arg
when Range
find arg.to_a
when Hash
find :all, arg
when :first, :all
find arg, *args
when :last
find(:all, *args).last
when Symbol
send "find_#{arg}", *args
else
find arg, *args
end
end

def update_counters(counters)
  self.class.update_counters id, counters
end

end
end
<<--

どうでしょう、お分かりだと思いますが、ARクラスに
インデクサ (rb_aref) を定義しています。こんな感じに動作します。

pre>>

Site[1].uri
=> "http://www.google.com/"

Site[1,2].map &:uri
=> ["http://www.google.com/", "http://www.wikipedia.org/"]

Site[1..2].map &:uri
=> ["http://www.google.com/", "http://www.wikipedia.org/"]

Site[:last].title
=> "Ruby/Tk チュートリアル"

Site[:by_uri, "http://www.google.com/"].uri
=> "http://www.google.com/"
<<--

実際のアプリケーションコードの中ではあまり使っていないですが、
script/consoleの中で使うのには大変便利です。

最後に、update_countersは、インスタンスメソッドとして
欲しかったので追加しています。
Rails 2.0から仕様が変わった counter_cache については、
日比さんがこちらに記事
既存のモデル/テーブルでcounter_cacheを使う:update_counters
を書いているので参照してみてください。

posted by genki genki on Tue 15 Jan 2008 at 06:20 with 0 comments
Contents rssrss
Leading Smart TV App Development Companies | USA | 4 Way Technologies
Apple TV Developer | TVOS Development | USA | 4 Way Technologies
光ファイバーを二次元振動させて走査するAR用ディスプレイ
因果の取り違え
Value Transformer
Swift2's defer for CoffeeScript
mongodb-3.0からcreateIndexのdropDupsが無くなったらしい
mongodb-3.0以降のWiredTigerの設定を動的に変更する方法
一般楕円の高速生成アルゴリズムへの道標
farro mantecatoのレシピ
Tags
AR
Comments rssrss
https://xn--mgmrket7-1ya.com https://xn--mgmrket7-1ya.com: Как распознать поддельное зеркало MEGA: признаки и... 04/21 00:25
https://xn--krken21-bn4c.com https://xn--krken21-bn4c.com: Как отличить настоящий маркетплейс от подделки Kra... 04/20 20:37
https://t.me/wp_seo/238 https://t.me/wp_seo/238: Какой процент погрешности при проверке? 04/20 02:15
https://vk.com/wall24679647_12405 https://vk.com/wall24679647_12405: Спасибо, буду тестировать этот функционал! 04/20 01:46
https://vk.com/wall24679647_12405 https://vk.com/wall24679647_12405: А как этот инструмент справляется с капчей? 04/20 01:17
https://terapistara.com/author/odetteochs4887/ https://terapistara.com/author/odetteochs4887/: Nice post. I appreciated reading. Thank you for sh... 04/19 21:01
https://tamozhenniiy-broker-sb11.ru/ https://tamozhenniiy-broker-sb11.ru/: Подскажите условия по хранению на СВХ, если оформл... 04/19 04:28
https://dostavka-izkitaya4.ru/ https://dostavka-izkitaya4.ru/: А сборные грузы от 100 кг возите из Шэньчжэня? 04/19 03:42