2011-11-14 14 views
1

私は完全なRails初心者ですし、助けていただければ幸いです。ActiveModel :: AttributeError rails 3

[ユーザー]テーブルから別のソースを選択しようとすると、現在エラーが表示されます。だから、SQLのクエリはかなり簡単です。このような何か:私もこれを試してみた

<%= f.select :source, User.find(:all, :select => "source") %> 

select distinct source from users; 

または

select source from users group by source; 

問題は、私の ".erb" ファイルで、私はこれを持っているということです

<%= f.select :source, User.select(:source).group(:source) %> 

この問題が発生していますセージ:明らかに

missing attribute: first_name 

は、私がFIRST_NAMEを選択していないんだけど、私は他の誰かが書いた私の "to_s" 方法では、戻り値は

full_name.blank? ? email.gsub(/(.).*(.)@/,'\1..\[email protected]').gsub(/@(.).*(.)\.([^.]+)/,'@\1..\2.\3') : full_name 

であることに気づいた:

def full_name 
    "#{self.first_name} #{self.last_name}".strip 
end 

だから、どこかで暗黙のうちに "to_s"が呼び出されていて、first_name属性が見つからないようです。

私のto_sメソッド(コードベースで広く使用されています)を変更する以外に、ユーザーテーブルから別のソースのリストを選択する方法はありますか?

答えて

1

問題select方法を使用してクエリはテーブルのみのsource列を返し、選択のためにあなたは、少なくとも2つのパラメータを必要とするだろうということで、何を行う可能性があるようなもの:

<%= f.select :source, User.find(:all,:select=>"source",:group=>"source").map {|u| [u.source,u.source]} %> 
+0

これは私が必要としているもののように見えます(テスト時に動作します)。何が起こっているのか、おそらくこれが元のコードスニペットと比べてなぜ機能するのかを少し説明できますか? – Ramy

+0

@Ramy選択ヘルパーは、 '[[" red "、1]、[" blue "、2]、[" green "、3]]のような2つのレベルの配列で動作します。内側の配列はselect要素に表示されるラベルテキストで、2番目の値はフォームで送信される選択値に対して行われる値で、 'map'は配列を生成し、項目私たちは内側の配列を押しています。 –

+0

@Ramyであり、もう1つの問題はクエリが1つのカラムを返すだけで、 'name'というカラムがないので' select'ヘルパーが少なくとも2つのカラム、 'name'と' id'を待っているということです。 'firs_name'カラムをデフォルトのカラム' name'に最も近いカラムで検索します。 –

1

理想的には、私は、ユーザーをHAS_MANYソースモデルを作成していますが、迅速な解決が必要な場合:コントローラで

class User < ActiveRecord::Base 
    def self.sources 
    all.group(:source).map(&:source) 
    end 
end 

@sources = User.sources 

形式:

<%= f.select :source, @sources.map{|s| [s,s]} %> 

をこれは動作するはずです。

関連する問題