2010-12-01 6 views
4

私がやったチュートリアルの例を超えて、いくつかの基本的なRailsの概念を理解するのに苦労しています。私は何をしようとしているのをQ/& A/docs/walkthroughs見つけることができないので、私はこれを間違った方法で行っている可能性が高いです。Rails 3:モデルのハッシュアクセサ?

多くのタグを持つTeamオブジェクトがあります。チームのテーブルには、いくつかの正規化されたフィールドを持っていますが、チームの特性のほとんどは、チーム「バージニアキャバリアーズは、」DB設計は多くの種類に対応するために意図されたタグなど

{[tag_name => 'Conference', tag_value => 'ACC'], 
[tag_name => 'Division', tag_value =>'I']} 

を持っている。すなわち、タグとして格納されていますタグテーブルを使用して任意の基準によるチームの検索を容易にします。

これまでのところとても良いです。私が理解できないことは、チームに与えられたチーム属性に最も良くアクセスする方法です。

class Team < ActiveRecord::Base 
    belongs_to :sport 
    has_many :team_subscriptions 
    has_many :users, :through => :team_subscriptions 
    has_many :tags 
    def tagvalue 
    #Set up a hash to retrieve tag value by name? 
    @tagvalue = {} 
    tags.each do |t| 
     @tagvalue[t.tag_name] = t.tag_value 
    end 
    Rails.logger.info(@tagvalues.keys) 
    end 
end  

ハッシュはありますが、私は希望通りにアクセスできません。

<%= @team.tagvalue["Conference"] %> 

これは合理的ですか?可能?あなたの応答に感謝します。

*(このサイトは素晴らしいです)*

第二の提案がツルツルsyntacticlyですが、私が見ることができる2つのハングアップを持っているフィードバックに基づいて編集されました。私は、すべてのチームがすべてのタグを持っているとしてヌルをキャッチする必要があり、時には彼らは同じリストに表示:

私の不器用な実装:edgerunnerへ

has_many :tags do 
    def [](key) 
    set = where(:tag_name => key) 
    if set.length > 0 
     set.first[:tag_value] 
    end 
    nil 
    end 
end 

クリーンなコードのおかげ:

has_many :tags do 
    def [](key) 
    where(:tag_name => key).first.try(:tag_value) 
    end 
end 

もし私が間違っていないなら、このメソッドはタグにアクセスするたびに余分なデータベース呼び出しを行います。最初のメソッドは、オブジェクトがインスタンス化されるときに1つだけ必要です。私はそれらの両方を得たか?

+0

考え方は、すべてを望む場合は 'team.tags'を使用し、1つだけの場合はアクセサーを使用することができます。そして、あなたはその拡張を複雑にする必要はありません。何も見つからなければnilを返します。 – edgerunner

+0

(:tag_name => key)が結果を返さなかった場合、私にとっては失敗していました。私は何か見落としてますか?ちなみに、ありがとうございました。 – RSG

+0

答えが更新され、結果セットが空のときに不平を言うことはありません。 – edgerunner

答えて

5

同じことを行う方法が異なる場合があります。匿名の関連付けの拡張を定義し、キーを使用してタグを取得するための配列アクセサメソッドを定義できます。

class Team < ActiveRecord::Base 
    ... 
    has_many :tags do 
    def [](key) 
     where(:tag_name => key).first.try(:tag_value) 
    end 
    end 
    ... 
end 

これは、あなただけではなく、それらのいずれかを使用して一度にすべてを取得するためのデータベースからのみ必要なタグを取得できるようになります。

+0

これははるかに慣用的な解決策です。 +1 –

+0

それはクールな機能です! – yfeldblum

関連する問題