Ruby on rails 集合选择多表涉及Rails 3.2.1,PostgreSQl

Ruby on rails 集合选择多表涉及Rails 3.2.1,PostgreSQl,ruby-on-rails,ruby-on-rails-3,drop-down-menu,Ruby On Rails,Ruby On Rails 3,Drop Down Menu,我正在尝试获取我的收藏列表的数据 细节 涉及到4个表 volunteers has_many :signed_posts has_many :posts, :through=>:signed_posts signed_posts belongs_to :volunteer belongs_to :post posts bel

我正在尝试获取我的收藏列表的数据

细节

涉及到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的签名_posts.id和posts.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'%>

我并不完全满意。我认为一定有一些优雅的解决办法。如果有人有更好的想法,请告诉我有几种方法。在控制器中,您需要一个语句,例如:

@signed_posts = Volunteer.find(1).signed_posts.includes({:post => :organization})
之后,一种方法是在SignedPost模型中创建一个方法来返回所需的数据,如下所示

def post_name_with_organization
  "#{id} #{post.title} - #{post.organization.name}"
end
然后,在您的集合中,您可以使用这部分猜测,因为我不知道您的表单的细节:

form.collection_select(:signed_post_id, @signed_posts, :id, :post_name_with_organization)
根据问题更新进行编辑

如果您想像在解决方案中一样使用select_标记和选项_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'%>