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 的。我想用 rails 3.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

结果,我想为志愿者 id 1获取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})

之后,一种方法是在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_tagoptions_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 回答