如何在 rails 上使用 has_many 和 belongs_to ruby 关联两个模型
how to associate two models using has_many and belongs_to ruby on rails
我在我的应用程序中生成了两个模型 tour 和 tourcategories。现在我想使用 has_many
和 belongs_to
关联这两个模型。其中旅游可以与单个旅游类别相关,但旅游类别可以有多个旅游。所以 tour
模型的定义如下:
class Tour < ActiveRecord::Base
belongs_to :tourcategory
attr_accessible :content, :element_id, :job_id, :title, :priority, :tourcategory
end
这是旅游类别模型的定义:
class Tourcategory < ActiveRecord::Base
has_many :tours
attr_accessible :title
end
这是旅游迁移文件的定义:
classCreateTours < ActiveRecord::Migration
def change
create_table :tours do |t|
t.string :element_id
t.string :title
t.text :content
t.integer :job_id
t.integer :priority
t.belongs_to :tourcategory, index:true
t.timestamps
end
end
end
这是旅游控制器的定义:
def new
@tourcategories = Tourcategory.all
@tour = Tour.new
@tour.build_tour
respond_to do |format|
format.html
format.json { render json: @tour }
end
end
现在我收到一个错误
undefined method `tourcategories'
当我访问 _form.html.haml
视图进行编辑和添加新游览时。
这是遇到错误的代码。
.field
= label_tag "tour Categories"
%br/
= select_tag "tourcategory", options_from_collection_for_select(Tourcategory.all, 'id', 'title', @tour.tourcategories.map{ |j| j.id })
= f.submit
您实际上需要使用 HABTM(Has And Belongs To Many)- 请查看 Rails documentation 了解更多详情
你定义了,
Tourcategory 有多个游览。 has_many :tours
旅游属于一个旅游类别。 belongs_to :tourcategory
因此,您不能从 @tour
调用 tourcategories
。你可以从 @tour
调用 tourcategory
此外,
@tour.build_tour
<- 可能会出错。
您可以对 belongs_to
关系使用 build_*
方法。
我想你应该试试 @tour.build_tourcategory
阅读 Rails 指南中的 "Action Record Association" 部分:http://guides.rubyonrails.org/association_basics.html
您不能调用 @tour.tourcategories
,因为 Tour
属于单个 Tourcategory
,因此 Rails 不会生成该方法。您可以致电 @tour.tourcategory
或 @tourcategory.tours
.
为什么要将第四个参数传递给 options_for_collection_from_select
?该 map
方法将 return 一个集合,但您需要一个元素。尝试省略它,看看它是否有效。
您的代码还有几个问题:
@tour.build_tour
将不起作用,除非您明确定义了该方法(如果有,最好将其命名为其他名称)。所有 build_something
方法都是为 has_one
关系生成的。也许您正在寻找 @tourcategory.tours.build
.
您不应从您的视图中调用 Tourcategory.all
,而应使用您在控制器中定义的 @tourcategories
变量。视图不应该直接调用模型。
如果您使用 Rails 4,则不应使用 attr_accessible
,而应在控制器中定义强参数。
希望对您有所帮助。
我在我的应用程序中生成了两个模型 tour 和 tourcategories。现在我想使用 has_many
和 belongs_to
关联这两个模型。其中旅游可以与单个旅游类别相关,但旅游类别可以有多个旅游。所以 tour
模型的定义如下:
class Tour < ActiveRecord::Base
belongs_to :tourcategory
attr_accessible :content, :element_id, :job_id, :title, :priority, :tourcategory
end
这是旅游类别模型的定义:
class Tourcategory < ActiveRecord::Base
has_many :tours
attr_accessible :title
end
这是旅游迁移文件的定义:
classCreateTours < ActiveRecord::Migration
def change
create_table :tours do |t|
t.string :element_id
t.string :title
t.text :content
t.integer :job_id
t.integer :priority
t.belongs_to :tourcategory, index:true
t.timestamps
end
end
end
这是旅游控制器的定义:
def new
@tourcategories = Tourcategory.all
@tour = Tour.new
@tour.build_tour
respond_to do |format|
format.html
format.json { render json: @tour }
end
end
现在我收到一个错误
undefined method `tourcategories'
当我访问 _form.html.haml
视图进行编辑和添加新游览时。
这是遇到错误的代码。
.field
= label_tag "tour Categories"
%br/
= select_tag "tourcategory", options_from_collection_for_select(Tourcategory.all, 'id', 'title', @tour.tourcategories.map{ |j| j.id })
= f.submit
您实际上需要使用 HABTM(Has And Belongs To Many)- 请查看 Rails documentation 了解更多详情
你定义了,
Tourcategory 有多个游览。 has_many :tours
旅游属于一个旅游类别。 belongs_to :tourcategory
因此,您不能从 @tour
调用 tourcategories
。你可以从 @tour
tourcategory
此外,
@tour.build_tour
<- 可能会出错。
您可以对 belongs_to
关系使用 build_*
方法。
我想你应该试试 @tour.build_tourcategory
阅读 Rails 指南中的 "Action Record Association" 部分:http://guides.rubyonrails.org/association_basics.html
您不能调用 @tour.tourcategories
,因为 Tour
属于单个 Tourcategory
,因此 Rails 不会生成该方法。您可以致电 @tour.tourcategory
或 @tourcategory.tours
.
为什么要将第四个参数传递给 options_for_collection_from_select
?该 map
方法将 return 一个集合,但您需要一个元素。尝试省略它,看看它是否有效。
您的代码还有几个问题:
@tour.build_tour
将不起作用,除非您明确定义了该方法(如果有,最好将其命名为其他名称)。所有 build_something
方法都是为 has_one
关系生成的。也许您正在寻找 @tourcategory.tours.build
.
您不应从您的视图中调用 Tourcategory.all
,而应使用您在控制器中定义的 @tourcategories
变量。视图不应该直接调用模型。
如果您使用 Rails 4,则不应使用 attr_accessible
,而应在控制器中定义强参数。
希望对您有所帮助。