0

collection_selectリストのデータを取得しようとしています。

詳細

関係する4つのテーブルがあります

       volunteers 
            has_many :signed_posts
            has_many :posts, :through=>:signed_posts

       signed_posts
            belongs_to :volunteer
            belongs_to :post

       posts
            belongs_to :organization
            has_many :signed_posts
            has_many :volunteers, :through=>:signed_posts

       organizations
            has_many :post

プレーンSQLで書く必要があるとしたら、以下のようになります。このSQLはpostgreSQL用です。Rails3.2.1の構文を書きたいと思います。

      Select sp.id,p.title ||'-'|| o.name AS project from signed_posts sp 
           inner join volunteers v on v.id=sp.volunteer_id
           inner join posts p on p.id=sp.post_id
           inner join organizations o on o.id=p.organization_id
           where v.id=1

結果として、ボランティアID1のsigned_posts.idposts.title--organizations.nameを取得したいと思います。

ドロップダウンリストで使用したいものです。

ご助力ありがとうございます

私の解決策

このようなハッシュテーブルを使って問題を解決しました

        @signed_projects=Volunteer.find(1).signed_posts.joins(:post)

        @ddl_test=Hash.new
            @signed_projects.each do |signed_project|
                   ddl_test[signed_project.post.title+"-"+signed_project.post.organization.name]=signed_project.id

           end

表示中

                <%=select_tag 'ddl_test',options_for_select(@ddl_test.to_a),:prompt => 'Please select the project'%>

私は完全に満足していません。エレガントな解決策があるに違いないと思います。誰かがより良い考えを持っているなら、私に知らせてください

4

1 に答える 1

0

これを行うにはいくつかの方法があります。コントローラでは、次のようなステートメントが必要になります。

@signed_posts = Volunteer.find(1).signed_posts.includes({:post => :organization})

その後、1つの方法は、SignedPostモデルにメソッドを作成して、必要なデータを返すことです。次のようになります。

def post_name_with_organization
  "#{id} #{post.title} - #{post.organization.name}"
end

次に、collection_selectで次を使用できます(フォームの詳細がわからないため、これは部分的に推測されます)。

form.collection_select(:signed_post_id, @signed_posts, :id, :post_name_with_organization)

質問の更新に基づいて編集

select_tagソリューションで行ったように使用したい場合options_for_selectは、コントローラーでこの変数を作成するのがより洗練された方法です。

@signed_posts_options = @signed_posts.map {|sp| [sp.post_name_with_organization, sp.id]}

次に、あなたの見解では:

<%=select_tag 'ddl_test',options_for_select(@signed_posts_options),:prompt => 'Please select the project'%>
于 2012-06-19T16:05:27.297 に答える