2011-04-18

has_and_belongs_to_manyのときのvalidate

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsで多対多の関係を
has_and_belongs_to_many
で表現したときのお話です。

Group

Member
があったとして
Memberは複数のGroupに参加可能とします。
なので
has_and_belongs_to_many
で関係を定義しておきます。

しかし特別ななんらかの理由でGroupに参加できない場合があるとします。
モデルで制約を作るならばGroupモデルとかに以下のようなvalidateを用意すれば
よいと思ったわけです。
def validate
  if xxx == yyy
    errors.add(:memgers,"都合によりこのグループはダメです")
  end
end

確かにvalidateはかかるのですが、
どういうわけか登録は出来てしまう感じでした。

でこれをなんとかしたいなぁと思ったら
has_and_belongs_to_many_with_deferred_save
というものが見つけました。
https://github.com/TylerRick/has_and_belongs_to_many_with_deferred_save

これを使えば使えるようになりました。

インストールは以下のような感じで。
./script/plugin install git://github.com/TylerRick/has_and_belongs_to_many_with_deferred_save.git

そしてGroupモデルは以下のような感じです。

has_and_belongs_to_many_with_deferred_save :members ,:before_add => :check_member

def validate
  self.members.each do |m|
    if m.xxx == yyy
      errors.add(:memgers,"都合によりこのグループはダメです")
    end
  end
end

def check_item(members)
  members.each do |m|
    if m.xxx == yyy
      raise("都合によりこのグループはダメです")
    end
  end
end

validateはなくてもよいとは思うのですが、ActiveScaffoldでvalidateのメッセージを拾うためには必要だったので他にもあるとよいかもしれないです。

なんかいろいろと制約がhas_and_belongs_to_many_with_deferred_saveにはありそうな気配ですが、とりあえずよしとしてみます。

2011-04-14

rubyでWake On LAN

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
電源が入っていないPCに対してマジックパケットという特別なパケットを送るとPCを起動できる
Wake On LAN
という機能があります。
詳細はどこかで調べていただけたらと思います。

これをrubyで実装する方法です。

http://www.geocities.jp/protozoa0/softs_j.html#m-packet

を参考にさせていただきました。

以下のようなファイルを用意します。
module  Wol

  require 'socket'

  def self.send(mac,bcast="255.255.255.255",port=40000)
    macb = [mac.gsub(/[\-\:]/, '')].pack('H*')
    packet = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff].pack("C*")
    16.times {
      packet = packet + macb
    }
    sock = UDPSocket.open
    sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
    sock.connect(bcast,port)
    3.times {
      sock.send(packet, 0)
    }
    sock.close
    true
  end
end

railsの場合でしたら
lib/wol.rb
という名前で作成しておけば
Wol.send("00:11:22:33:44:55")
みたいな感じで利用できます。

ActiveScaffoldで独自リンクをクリックしたときに確認をする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActvieScaffoldのお話です。

独自リンクを作るときは、action_linksを使うわけですが、
その独自リンクをクリックしたときに
「本当にいいですか?」
的な確認を表示させる方法です。

以下のような感じです。
config.action_links.add 'ohoho', :label => 'おほほ', :page => true,
:type => :table, :confirm => '本当にいいですか?'

このようにすると
おほほ
というリンクが作成されて、クリックすると
「本当にいいですか?」
と確認が表示されます。
それでohohoアクションが実行されます。

ActiveScaffoldやっぱりステキです。

2011-04-05

rubyで装飾されたExcelファイルを作成する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
というよりもテンプレート的に事前に装飾したExcelファイルを用意しておいて、それを元にファイルを作る感じです。

まず、装飾したテンプレートとして利用するExcelファイルを用意します。

これをaaa.xlsとして保存します。

Excelをいじるために
spreadsheet
を利用します。
なので
gem install spreadsheet
しておきます。

以下のような感じのことを書きます。
require 'spreadsheet'

#とりあえずテンプレートとしたExcelを開きます
book = Spreadsheet.open('aaa.xls')

#値を埋めていきます
sheet = book.worksheet(0)
sheet[0,0] = 'aaa'
sheet[1,0] = 'aaa'
sheet[2,0] = 'aaa'
sheet[3,0] = 'aaa'
sheet[6,0] = 'aaa'
sheet[6,1] = 'aaa'
sheet[6,2] = 'aaa'
sheet[6,3] = 'aaa'

#特定行のフォーマットをコピーしていくには以下のような感じです
#とりあえずデータをセットします。
sheet[7,0] = 'bbb'
sheet[7,1] = 'bbb'
sheet[7,2] = 'bbb'
sheet[7,3] = 'bbb'
#適用した装飾がされている行のフォーマットをコピーします。
sheet.row(7).set_format(0,sheet.row(6).format(0))
sheet.row(7).set_format(1,sheet.row(6).format(1))
sheet.row(7).set_format(2,sheet.row(6).format(2))
sheet.row(7).set_format(3,sheet.row(6).format(3))

#最後に別名で保存します。
book.write('bbb.xls')

これで以下のような感じのファイルが作成できます。


2011-04-01

ピクチャートレーサー

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク


絵を写すときに使うものなのです。
昔、同じことするものだけどえらく大きなものがあったけど、今はLED利用でこんなに薄くなるのねん。
ということでキニナルのです。

enepo

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク


カセットガスを利用した発電機があることを知らなかったのでキニナルのです。

家の中では使ってはいけないものだそうなのです。