私がやったチュートリアルの例を超えて、いくつかの基本的な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つだけ必要です。私はそれらの両方を得たか?
考え方は、すべてを望む場合は 'team.tags'を使用し、1つだけの場合はアクセサーを使用することができます。そして、あなたはその拡張を複雑にする必要はありません。何も見つからなければnilを返します。 – edgerunner
(:tag_name => key)が結果を返さなかった場合、私にとっては失敗していました。私は何か見落としてますか?ちなみに、ありがとうございました。 – RSG
答えが更新され、結果セットが空のときに不平を言うことはありません。 – edgerunner