2011-07-10 15 views
1

私はこれが何と呼ばれているのか分かりませんが、has_many bというモデルがあります。いくつかのモデルをビューに表示すると、次のようなモデル関連付けをすべて説明するテキストを印刷したいと考えています。ルビーヘルパーは、関連付けのまわりでビューのテキストを作成する

"foo、bar、baz、##との関連性があります

foo、bar、bazは3つのmobdel bの名前です。 3つ以上の名前がある場合はすべての名前を印刷したくないので、残っている連想の数を残しておきたいと思います。

私はRubyでプログラム的にこれを行うことができますが、いくつかのヘルパーメソッドが私のためにこれを行うことができますが存在する場合、私は思っていた。..

感謝。

答えて

0

文字列にアイテムを変換する範囲検査+任意のブロックとバージョン:

def enumerate_as_text(seq, max, &block) 
    text = seq.first(max).map { |itm| 
    block_given? ? yield(itm) : itm.to_s 
    }.join(", ") 
    text += ", and #{seq.length - max} more" if max < seq.length 
    text 
end 

試運転:

blob = %w{a b c d e f g h i j} 

puts blob.length 
puts blob.join(", ") 
puts enumerate_as_text(blob, 1) 
puts enumerate_as_text(blob, 4) 
puts enumerate_as_text(blob, 9) 
puts enumerate_as_text(blob, 10) 
puts enumerate_as_text(blob, 11) 
puts enumerate_as_text(blob, 20) { |itm| "itm: #{itm}" } 

出力:

10 
a, b, c, d, e, f, g, h, i, j 
a, and 9 more 
a, b, c, d, and 6 more 
a, b, c, d, e, f, g, h, i, and 1 more 
a, b, c, d, e, f, g, h, i, j 
a, b, c, d, e, f, g, h, i, j 
itm: a, itm: b, itm: c, itm: d, itm: e, itm: f, itm: g, itm: h, itm: i, itm: j 
+0

それは質問に答えることができません:彼は自動的にどのように団体を得ることができましたか? – apneadiving

+0

答えの一部は 'reflect_on_all_associations'を使うべきだったはずです – apneadiving

0

私はそれを簡単に行う方法は見当たりません。それを得るためのRuby/Railコードはかなりシンプルです。では、自分でヘルパーメソッドをやってみませんか?あなたのメソッドのシグネチャは次のようになります。

def truncate_models(models, numbers) 
    models[0..numbers-1].map{|m| m.name}.join(", ") + "and #{models.size - numbers} more..." 
end 

ので

.models 
    Has an association with 
    = truncate_models(models, 3) 

(HAMLの方法で)を呼び出すことによって、あなたが望む結果を得る必要があります。

+0

それが質問に答えていません。どのように彼は自動的に団体を得ることができますか? – apneadiving

+0

答えの一部は 'reflect_on_all_associations'を使用していたはずです – apneadiving

+0

@apneadiving、私が質問を読むと、dhruvgは3つ以上のものがすべてクラスB、" has_many bをモデル化する "ことを知っています。 dhruvgはすべての型のすべての関連を探しているわけではないので、 'reflect_on_all_associations'は必要ありません。それは質問されていない質問に対する答えです。 –

関連する問題