irbマジ便利

ちょっとVBAの案件で、一行230項目ほどのCSVをテストで作りました。
できない事はないけど、手でやると面倒な程度の作業。
こんな時はirb(Rubyのインタプリタ)を起動して…


(1..5).each {|i|
a = (1..230).to_a.map!{|j| "#{i}-#{j}"}.join(',')
puts a
}


以上。いちいちaなんて変数を作らずに

puts (1..230)…

の方が早いのですが、それだとコンソールに出力されませんでした。
(Windows XP Professional、Ruby 1.8.5)
プログラム | comments (19) | trackbacks (0)

独自タグを定義する

MTとかで使ってる、ビューの独自タグについて。
例えば
<!-- do_something -->
こんなコメントを自動解釈して、実行してくれる感じ。
これをRuby的に書くなら、どうするか。


def set_view
template = get_template #これで、ビューのテンプレートを取得する(ものとして下さい)
my_tags = ['<!-- do_something -->',
'<!-- show_something -->',
'<!-- play_something -->']

my_tags.each {|tag|
template.gsub(tag, convert(tag))
}
end

private
def convert(tag) #タグを変換、実行
case tag #実際の処理はタグによって異なる
when '<!-- do_something -->'
do_something
when '<!-- show_something -->'
show_something
when '<!-- play_something -->'
play_something
end
end


何となく、冗長な気がしないでもない…
my_tagsはハッシュにして、タグをキー、実行されるメソッドを値とし、evalとかで値を評価して実行してしまえばいいのかも。
独自タグを配列orハッシュでまとめるのはありだと思うんですが。
まあ、今回はテンプレートはRHTML直にするので、何かの時用メモ。
プログラム | comments (12) | trackbacks (0)

子カテゴリの子カテゴリの子カテゴリの

ウェブログ実装にあたり、カテゴリがサブカテゴリを何階層でも持てるようにしようと思いました。
それの実装メモ。

Railsには、acts_as_treeとかいう、簡単に樹構造を作ってくれるプラグインもあるらしいですが…
今回、簡単に実装できそうだったので、自分で作る事に。
プラグインは便利ですが、頼りすぎるとばかになるので、頭を使います。

パターン1
-あるカテゴリへのパンくずリストを作る。

パンくずリストというのは、こんなのです。
オタク | アニメ | らき☆すた | みなみ
例が気持ち悪いですが、イメージは分かりますか?
こんな形で、上位カテゴリからのリストを作ればいいわけです。
以下、親カテゴリのidはcategory.parent_idで取得可能として、実装。


def get_topic_path(ary = []) #Categoryクラスに定義
ary.unshift(self)
if self.parent_id.nil?
return ary
else
Category.find(self.parent_id).get_topic_path(ary)
end
end


selfとかreturnは省略可能、最近は書かない事が多くなりました。
以前はJavaやらCの影響で、略すると気持ち悪かったのですが、住めば都?

パターン2
-上位カテゴリから、全カテゴリのリストを作る。

さっきとは逆に、子をたどっていくパターン。
では、いってみましょう。


def get_tree_list #木構造でリスト作成
children = Category.find_by_parent_id(self.id)
unless children.blank?
self.categories = children
children.each {|child|
child.get_tree_list
}
end
end


以上。
まだテストはしていませんが、考え方はこんなもんのはず。
同じようなものをCで作った時は、めちゃくちゃ面倒だった思い出があります。
Rails、確かに楽なんですが、ときどき難しい問題も解かないと、どんどんばかになる気がします。
プログラム | comments (172) | trackbacks (0)