3

私はRails 3アプリに取り組んでおり、コントローラーの1つに次のような行があります:

@features = Feature.find(:all, :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')
@feature = @features.find(params[:feature])

アイデアは、いくつかの制約に従ってDBから一連の「機能」を取得し、そのセットから特に1つを選択することです。問題のレコードが DB に存在するが、制約に適合しない場合、それを返したくありません。したがって、私は@features.findではなくやっていFeature.findます。

私が抱えている問題は@feature.title、エラーを生成しているビューが必要であることです:

undefined method 'title' for #<Enumerator:0x0000010216efd8>

もちろん、上記をこれに置き換えることで問題を回避できます。ここでは、制約を 2 回定義するだけです。

@features = Feature.find(:all, :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')
@feature = Feature.find(params[:feature], :conditions => ['featured_at < ?', Time.current], :order => 'featured_at ASC')

しかし、これはエレガントではなく、少し冗長に思えます。

最善の解決策は何ですか? ビューでアクセスする必要がある変数/メソッドを欠いているのではなく、@features.find結果をそのまま処理するにはどうすればよいですか?FeatureEnumerator

これについてご意見をお寄せいただきありがとうございます。

4

1 に答える 1

1

私はこれを提案します:

@features = Feature.where('featured_at < ?', Time.now).order('featured_at ASC')
@feature = @features.find(feature_id)

ここfeature_idで、セットから取り出したい ID (または ID のリスト) です。2 行目だけがデータベースにヒットします。問題は、:allオプションがメソッドにクエリを送信して配列を返すように強制することです。

于 2011-06-18T18:04:43.197 に答える