This works, but it can't be best practice. Advice?

I want to display all the projects in which a given team has a
product. The following code works, but isn’t there a better way?
Railsier? Better Practice?

#Models#

class Team < ActiveRecord::Base
has_many :products
has_many :funding_sources, :through=>:products
end

class Product < ActiveRecord::Base
belongs_to :funding_source
belongs_to :team
end

class FundingSource < ActiveRecord::Base
belongs_to :project
has_many :products
end

class Project < ActiveRecord::Base
has_many :funding_sources
has_many :products, :through=>:funding_sources
has_many :teams, :through=>:products #Can I do this?
end

#projects_controller.rb#

Goal: all the projects in which a team has a product.

GET /projects/by_team/team_id

GET /projects/by_team/team_id.xml/

def by_team
begin
@team = Team.find(params[:team_id])
rescue
@projects=Project.find(:all)
else
[email protected]
funding_ids = products.reduce([]){|items, product|
items.push(product.funding_source_id)}

fundings=FundingSource.find(:all, :select=>:project_id,:conditions=>[“id
IN (?)”, funding_ids.uniq])
project_ids = fundings.reduce([]){|items, funding|
items.push(funding.project_id)}
@projects = Project.find(:all, :conditions=>[“id IN (?)”,
project_ids.uniq])
end
respond_to do |format|
format.html #by_team.html.erb
format.xml { render :xml => @projects }
end
end

I can add some of the

Well, this is a little better.
.
.
.
else
[email protected]_sources
project_ids = fundings.reduce([]){|items, funding|
items.push(funding.project_id)}
@projects = Project.find(:all, :conditions=>[“id IN (?)”,
project_ids.uniq])
end
.
.
.
So, now the problem becomes: how do I get all the projects that belong
to a bunch of funding sources? I am just sure there’s a syntax that I
missed in the Rails Associations tut. “fundings.projects” doesn’t
work.

Ron

Added this to Project model:
def self.find_in_funding_sources(f_s)
project_ids = f_s.reduce([]){|items, funding|
items.push(funding.project_id)}
projects = Project.find(:all, :conditions=>[“id IN (?)”,
project_ids.uniq])
return projects
end

now the controller looks better:
.
.
.
else
@projects =
Project.find_in_funding_sources(@team.funding_sources)
end
.
.
.

I don’t know why I thought associations would take care of this.
Anyway, if they will, let me know how, please.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs