如何在rails上使用has_many和belongs_to ruby​​关联两个模型

时间:2015-12-11 11:09:37

标签: ruby-on-rails ruby has-many model-associations belongs-to

我在我的应用程序中生成了两个模型tour和tourcategories。现在,我想使用x /400bx $esphas_many关联这两个模型。游览可以与单个旅游类别相关,但旅游类别可以有多个游览。因此,belongs_to模型的定义如下:

tour

这是tourcategory模型的定义:

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

CreateTours < 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

3 个答案:

答案 0 :(得分:0)

你定义了,
Tourcategory有多个旅游团。 has_many :tours
游览属于一个Tourcategory。 belongs_to :tourcategory

因此,您无法从tourcategories致电@tour。您可以从tourcategory

致电@tour

Additionaly,
@tour.build_tour&lt; - 可能会犯错误。 您可以使用build_*方法获得belongs_to关系 我想你应该试试@tour.build_tourcategory

阅读&#34;行动记录协会&#34; Rails指南中的部分:http://guides.rubyonrails.org/association_basics.html

答案 1 :(得分:0)

您无法呼叫@tour.tourcategories,因为Tour属于单个Tourcategory,因此该方法不会由Rails生成。您可以致电@tour.tourcategory@tourcategory.tours

为什么你要将第四个参数传递给options_for_collection_from_selectmap方法将返回一个集合,但您需要一个元素。尝试省略它,看它是否有效。

您的代码还有一些问题:

除非您明确定义了该方法,否则

@tour.build_tour将无法工作(如果您有,则可能更好地将其命名为其他方法)。为build_something关系生成所有has_one方法。也许您正在寻找@tourcategory.tours.build

您不应该从视图中调用Tourcategory.all,而是使用您在控制器中定义的@tourcategories变量。视图不应该直接调用模型。

如果你正在使用Rails 4,你不应该使用attr_accessible,而是在控制器中定义强参数。

希望有所帮助。

答案 2 :(得分:-1)

你实际上需要使用HABTM(拥有和属于许多人) - 请查看Rails documentation了解更多详情