我有3个表categories
,其中包含字段ID,name,parent_id,coaches
,其中包含id,name和连接表categories_coaches
以及category_id和coach_id。我想加入两个table(categories_coaches和类别)与category_id并获取parent_id。当我运行这个时,请给我一个解决方案
这是我的代码
模型
class Category < ActiveRecord::Base
has_and_belongs_to_many :coaches
end
class Coaches < ActiveRecord::Base
has_and_belongs_to_many :categories
end
查看/ new.html.erb
<%= select_tag 'category', options_from_collection_for_select(@category.coaches, 'id', 'name')%>
控制器
class CategoriesController < ApplicationController
def new
end
end
当我尝试这个我得到这个错误
答案 0 :(得分:1)
您需要以单数名称格式调用模型。
您还需要确保您的关联反映它们是单数还是复数(belongs_to
是单数):
class CategoryCoach < ActiveRecord::Base
belongs_to :category
end
这也适用于其他协会:
#app/models/coach.rb
class Coach < ActiveRecord::Base
has_many :category_coaches
end
<强> ActiveRecord的强>
您需要处理ActiveRecord关联。具体来说,您已经以一种特殊的方式关联了模型。
我使用has_and_belongs_to_many
关联:
#app/models/coach.rb
class Coach < ActiveRecord::Base
has_and_belongs_to_many :categories
end
#app/models/category.rb
class Category < ActiveRecord::Base
has_and_belongs_to_many :coaches
end
您需要一个包含以下内容的联接表:
#categories_coaches
category_id | coach_id
这将使您能够调用@category.coaches
等:
<强>结构强>
我认为内容存在更深层次的结构性问题。
首先,为什么要将 ProgrammesController 嵌入命名空间?命名空间与您的控制器结构无关 - 它只是提供了一种隔离应用程序功能的方法。
你应该像这样构建你的应用程序:
#config/routes.rb
resources :coaches do
resources :programmes #-> url.com/coaches/:coach_id/programmes/new
end
#app/models/coach.rb
class Coach < ActiveRecord::Base
has_many :programmes
end
#app/models/programme.rb
class Programme < ActiveRecord::Base
belongs_to :coach
end
#app/controllers/programmes_controller.rb
class ProgrammesController < ApplicationController
def new
@coach = Coach.find params[:coach_id]
@programme = @coach.programmes.new
end
def create
@coach = Coach.find params[:coach_id]
@programme = @coach.programmes.new programme_params
@programme.save
end
private
def programme_params
params.require(:programme).permit(:x, :y, :z)
end
end
答案 1 :(得分:0)
您的关联名称错误:
class Category < ActiveRecord::Base
has_many :category_coaches
end