例えばselect結果をinsertするような場合は効率面からActiveRecordを通さずそのままSQLを実行したい。select結果が数千件ある場合ARで素直に書くとそのまま数千回insert実行しなきゃならんので。

Railsでは基本ARで操作できるけど必要があればSQL書ける柔軟な所がある。
今回の場合ActiveRecord::Base::connection::executeを使用する。
Railsレシピブックで言うとP239の例。

ruby>>
Class Entry < ActiveRecord::Base
def self.select_insert_hogehoge
sqlstr = "hogehoge"
return connection.execute(sqlstr)
end
end
<<ruby

posted by ysakaki ysakaki on Thu 28 Aug 2008 at 15:53 with 0 comments

NetBeans6.1で「プロジェクト内を置換」を実行した場合。
コメント内を置換するとそれ以降のソースが吹っ飛ぶ。
日本語関係の問題なのか、コメント内だからいけないのかとか、そこまでは調べていない。

下記のコードで「# ・」みたいになってそれ以降のソースがなくなってしまう
(苦笑)
ruby>>
# ソート条件
<<ruby

posted by ysakaki ysakaki on Mon 25 Aug 2008 at 09:16 with 0 comments

チームで開発しているときに「俺が関係しているテーブルのfixtureだけloadしたいんだぜー」というときに使う。使い方は調べたけど結局使わなかった。

rake db:fixtures:load fixtures=fixture1,fixture2,fixture3,・・・

posted by ysakaki ysakaki on Mon 25 Aug 2008 at 08:26 with 0 comments

色々奥が深いと思った(not http://0xcc.net/misc/bad-knowhow.html 笑)

■前提:記事←関連テーブル→ユーザというモデル関係がある。
ruby>>

has_many :throughのパターン

class Article< ActiveRecord::Base
has_many :articles_users
has_many :users, :through => :articles_users
end

class User < ActiveRecord::Base
has_many :articles_users, :dependent => :destroy
has_many :articles, :through => :articles_users
end

関連テーブルを実テーブルで持つ

class ArticlesUsers < ActiveRecord::Base
belongs_to :article
belongs_to :user
end
<<ruby

■関連テーブルの操作

あるユーザの関連をごそっと別の関連に切り替えたいような場合!

User.articles_users.destroy_allして作り直すという方法もあるが
User.articles_users.replace()という便利なメソッドがある。

AWD第二版(AgileWebDevelopment)で言うとP308。
「○orders.replace(order1,...)
この顧客に関連付けられた注文のセットを、新しいセットに置き換える。現在の子のセットと新しいセットの違いを検出し、それに応じてデータベースの変更を最適化する。」という奴。

ruby>>
/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_collection.rb

  # Replace this collection with +other_array+
  # This will perform a diff and delete/add only records that have changed.
  def replace(other_array)
    other_array.each { |val| raise_on_type_mismatch(val) }

    load_target
    other   = other_array.size < 100 ? other_array : other_array.to_set
    current = @target.size < 100 ? @target : @target.to_set

    @owner.transaction do
      delete(@target.select { |v| !other.include?(v) })
      concat(other_array.select { |v| !current.include?(v) })
    end
  end

<<ruby
これは便利。

1.配列を放り込むだけ

「Replace this collection with +other_array+」ということで検索結果、あるいはセッションなどで生成した新しい関連の配列を放り込むだけで使える。

2.以前の関連との差分をチェックして差分だけ反映してくれる。

「This will perform a diff and delete/add only records that have changed.」ということで必要な差分だけチェックして必要なdelete/addをしてくれる。

ちなみにdeleteだと「Railsレシピブック」のP157「Entryオブジェクトobjectとの関連を削除する。Entryオブジェクトobjectの外部キー(blog_id)をNULLにし、関連を削除する。複数の参照元オブジェクトを同時に指定できる。」にある通り、関連テーブルの実レコードは削除されない(外部キーがNULLになるだけ)。関連テーブルにごみが残って気持ち悪い場合は上記モデルのように「:dependent => :destroy」を付けると物理的に削除される。

posted by ysakaki ysakaki on Fri 22 Aug 2008 at 15:39 with 0 comments

remote_functionではPost値を:withでいちいち指定する必要がある。
フィールドの数が多い場合は大変だ。

そういう場合、prototype.jsにForm.serialize('フォームのID')でフォームの値をname1=value1&name2=value2形式にしてくれる関数が便利である。

ruby>>
<%= javascript_include_tag "prototype" %>

<<ruby

posted by ysakaki ysakaki on Tue 19 Aug 2008 at 11:57 with 0 comments
たとえばJavaScriptの都合などでactionがnewでもeditでもフォームタグのidが同じになって欲しいことがある。 そういう場合は:html=>{:name1=>'value1',:name2=>'value2'}でhtmlオプションを指定できる。 ruby>> <% remote_form_for(@article, :url => {:action => :update, :id => @article}, :update => 'list',:html=>{:id=> 'article'}) do |f| %> <%= render :partial=>f %>

<%= f.submit "保存" %>

<% end %> <
posted by ysakaki ysakaki on Tue 19 Aug 2008 at 11:53 with 0 comments

begin~rescue~endで処理する。
例外のメッセージにパターンがある場合はex.messageが特定文言を含むかどうか調べて人間に優しいメッセージに変更する。

ruby>>
def destroy
@article = Article.find(params[:id])
begin
if @article.destroy
flash[:notice] = '記事を削除しました。'
end
rescue => ex
#「violates foreign key」は外部キーの参照エラー。関連テーブルが存在するため削除できないことを意味する。
if ex.message=~/violates foreign key/
flash[:notice] = '該当記事を参照しているデータがあるため削除できません'
else
#その他の例外
flash[:notice] = ex.message
end
end
redirect_to :action => 'index'
end
<<ruby

posted by ysakaki ysakaki on Tue 12 Aug 2008 at 11:56 with 0 comments

サーバーを再起動したらmysqlが起動していなかった。 サービスとして登録するには以下。
shell-unix-generic>>

chkconfig --list mysqld

mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
#chkconfig --level 345 mysqld on
#chkconfig --list mysqld
mysqld 0:off 1:off 2:off 3:on 4:on 5:on 6:off
<<shell-unix-generic

posted by ysakaki ysakaki on Wed 6 Aug 2008 at 17:22 with 0 comments

railsのcheck_buttonタグで選択済(checked)にするには、最後に:checked=>'checked'を追加する。

ruby>>
radio_button("myform","category",1, :checked=>'checked')
<<ruby

すると下記のようなHTMLが出力される。

html>>

<<html

posted by ysakaki ysakaki on Wed 6 Aug 2008 at 15:37 with 0 comments

CMSで改行入力したものを出力時に
として出力するヘルパタグ。
application_helper.rbに追加する用。

ruby>>
def hbr(str)
str = html_escape(str)
str.gsub(/\r\n|\r|\n/, "
")
end
<<ruby

VIEW側では<%=hbr textarea_value %>のように使う。

posted by ysakaki ysakaki on Tue 5 Aug 2008 at 15:11 with 0 comments
Contents rssrss
榊祐介に関する最新情報について
「三鷹プログラマーズカフェβ」を始めます
MacのTerminal.appでSSHのセッション切れを防止するには
MacのNetbeans6.5でfast-debuggerを使用するには
Railsでテスト環境にdb:fixtures:loadするには
MacOS X(10.5)のNetBeans6.5でコミットエラーが出る場合
[Slicehost]MySQLとRuby/Railsの導入
WEBサービス用のapache設定を追加する
Slicehostと契約したら最初にやること
Excel で1行おきに色付けする方法
Tags
railsActiveRecordchkconfigfixtureshas_manylinuxmysqlNetBeans61remote_form_forremote_functionrubyshellthrough例外
Comments rssrss
satoko satoko: 私もGIMP入れてみたんですよ、で、同じ文字化け。 言語の優先順位を1.English、2:日本語... 11/28 07:38
榊 祐介 榊 祐介: >satokoさん コメントありがとうございます。 画像編集はGIMPを入れてみたのですがいきなり... 11/25 14:41
satoko satoko: しまったsubmitするの忘れてたのですが、昨日書いていたコメントです。^^ 11/19 10:59
satoko satoko: あわあわ、私も今日までずっと困っていました。先ほど別のところでこの設定方法を学んだところです!mac... 11/19 10:59
榊 祐介 榊 祐介: 検索したら自分のブログだった乙orz 11/11 15:07
naka54 naka54: こんにちは。先日は写真を撮影いただいてありがとうございました。 弊社でもこんなコースをやっていたりし... 09/10 19:02
瀧内元気 瀧内元気: どもども。こちらこそですー。 07/31 07:55
榊 祐介 榊 祐介: おー。瀧内さんお元気ですかー。 Rails勉強会とかでお世話になっております。 07/29 13:41
Services from s21g
MagicBag
MagicBagは、Cloudflare R2やS3互換ストレージをMacのFinderから扱えるファイル同期クライアントです。
アンテナショップめぐり
東京にある全国のアンテナショップ、イベント、特産品を地図や条件から探せるサービスです。
YOMU Web小説リーダー
YOMUは、Web小説の読み上げに特化したiPhoneアプリです。
補助探
公開されている補助金・助成金情報を集約し、条件に合う制度を探しやすくするサービスです。
jotter.me
jotter.meは、考えやアイデア、情報を書き留めるためのノートサービスです。