acts_as_searchable は、 HyperEstraier を使って簡単に全文検索を行うことができる、 非常に便利なRailsプラグインです。 しかし、HyperEstraierが提供する類似検索機能を使うインターフェイスが 用意されていないようだったので、類似検索機能を付け足しました。

オリジナルの acts_as_searchable に対する差分はこちらにあります。

使い方

まずは、オリジナルと同様に検索対象のモデルに acts_as_searchableを書き加えます。 必要に応じて適切なオプションを指定してください。

app/models/article.rb

   1  class Article < ActiveRecord::Base
   2    acts_as_searchable

あとは、以下のように類似検索を行うだけです。

   1  Article.similarity_search(target_article, :limit => 5)

ちなみに、このブログの類似記事表示機能でも使用しています。

MIT LICENSE に基づいて、修正版を再配布します。

  1. このソフトウェアを誰でも無償で無制限に扱って良い。但し、著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載しなければならない。
  2. 作者または著作権者は、ソフトウェアに関してなんら責任を負わない。

修正部分のコードもMIT LICENSEとします。

posted by Png genki on Thu 29 Nov 2007 at 23:08

SyslogLogger

SyslogLogger is a Logger replacement that logs to syslog. It is almost drop-in with a few caveats.

SyslogLoggerを使うと、railsのログを syslog に記録するように する事ができます。

インストール方法

   1  % sudo gem install SyslogLogger

普通に rubygems としてインストールできます。 続いて、アプリケーションの設定を行います。

config/environments/production.rb

   1  # SyslogLogger
   2  require 'syslog_logger'
   3  RAILS_DEFAULT_LOGGER = SyslogLogger.new 'appname'

appnameはアプリケーションを識別する名前に置き換えてください。

さらに、syslogの設定を行います。 rootになって以下の記述を書き加えます。

/etc/syslog.conf

!appname
*.*     /var/log/appname.log

修正が済んだら、空の/var/log/appname.logファイルを作成して syslogdを再起動します(例えば killall -HUP syslogd

これで、以後は /var/log/appname.log 及び /var/log/syslog に ログデータが書き出されるようになります。

posted by Png genki on Thu 29 Nov 2007 at 05:28

Hash#sliceが欲しい をさらに拡張。

指定したキーを取り除いたHashを返すHash#exceptを追加。 併せて、既存のHash#sliceHash#onlyに改名してみました。

hash_ext.rb

   1  class Hash
   2    def only(*args)
   3      args = *args if args[0].is_a? Array
   4      args.inject({}){|hash, key| hash[key] = self[key]; hash}
   5    end
   6    
   7    def except(*args)
   8      args = *args if args[0].is_a? Array
   9      args.inject(dup){|hash, key| hash.delete(key); hash}
  10    end
  11  end

使い方:

   1  cond = params.only :year, :month, :day
   2  ma = MonthlyArchive.find :all, :conditions => cond.except(:day)

posted by Png genki on Thu 29 Nov 2007 at 03:08

ドメイン境界を越えてjsで通信する方法。

Introducing CrossFrame, a Safe Communication Mechanism Across Documents and Across Domains

たぶんShootingStarで使ってる方法と同じものだと思う。

posted by Png genki on Wed 28 Nov 2007 at 16:11

ので作ってみた。

hash_ext.rb

   1  class Hash
   2    def slice(*args)
   3      args = *args if args[0].is_a? Array
   4      args.inject({}){|hash, key| hash[key] = self[key]; hash}
   5    end
   6  end

使い方:

   1  conditions = params.slice :year, :month, :day

posted by Png genki on Wed 28 Nov 2007 at 04:16

Rails 2.0(RC1)でチェックしてみたところ、以下のような構文で migration コードの生成時に追加・削除を行うcolumnを指定できるようです。

   1  % ./script/generate migration add_fullname_to_users fullname:string

この結果、生成生成されるコードは以下の通り。

db/migrate/XXX_add_fullname_to_users.rb

   1  class AddFullnameToUsers < ActiveRecord::Migration
   2    def self.up
   3      add_column :users, :fullname, :string
   4    end
   5  
   6    def self.down
   7      remove_column :users, :fullname
   8    end
   9  end

ちょっと前まで、add_xxxx_to_yyyy で yyyyテーブルにxxxxカラムを 追加するという感じの挙動をしていたのですが、それは無くなったみたいですね。 まだRC1なので最終的にどういう形に落ち着くか分かりませんが、 なかなかいい感じです。

posted by Png genki on Wed 28 Nov 2007 at 02:07

今まできちんと動作していなかった、DailyとMonthlyのアーカイブ表示の 実装を修正しました。

記事一覧表示画面の上部に表示されているカレンダーからアクセスできます。

よろしくお願いします。

posted by Png genki on Tue 27 Nov 2007 at 17:44

そうじゃないか。

posted by Png genki on Tue 27 Nov 2007 at 09:05

Railsのroutes.rbでNamed Routeを利用するときに、 メソッド名の競合などで通常は使えない名前をどうしても 利用したい場合、以下のように記述することで利用できます。

config/routes.rb

   1  map.send :method_missing, :touch, 'foo/:id/touch', :action => 'touch'

メソッドがすでに定義されているため、method_missing が呼ばれなくなっている状態を無理やり回避しています。

posted by Png genki on Mon 26 Nov 2007 at 15:02

Railsのプラグインは、簡単に作れるせいか、おかしな、 というか、随分てきとうな名前のものが多いのですが、最近は 一時期流行していたacts_as_xxxable系のプラグインに代わり、 xxx_fuという名前のプラグインが増えてきました。

timezone_fu

  • Timezone conversion with TZInfo as easy as has_timezone :fields => [ :start_datetime, :end_datetime].
  • 美しい世界地図が印象的

enum_fu

  • Make an integer field as an enum typed one

resource_fu

  • A collection of hacks that make nested and polymorphic resources less painful.

Bundle-fu

  • CSS/JS asset bundling in 10 seconds or less!
  • Rails-2.0 Readyだ!

mimetype-fu

  • Get the content type / mime type of a file. Great to use with attachment_fu or to validate Flash uploads.

Attachment Fu

  • Rewrite of acts_as_attachment
  • Amazon S3も使える

Permalink Fu

  • Create permalinks from attributes

BackgroundFu

  • Threadを使って時間がかかる処理を行う

さて、次に流行するのはどんな名前でしょう。

更新履歴

  • 2007/12/11 BackgroundFuを追加
posted by Png genki on Mon 26 Nov 2007 at 05:43