【问题标题】:Ruby on Rails: Relation between two modelsRuby on Rails:两个模型之间的关系
【发布时间】:2015-12-24 19:37:05
【问题描述】:

我正在挑战自己建立一个小市场,您可以在其中发布一个类别内的“请求”。为此,我同时拥有请求模型和类别模型。如何在这些模型之间添加关系,以便 Category 知道它属于请求,反之亦然?我已经这样做了:

category.rb

has_and_belongs_to_many :requests 

request.rb

has_one :category

现在在我的部分表单中,我有以下代码:

<%= f.select :category, Category.all, :prompt => "Kategorie", class: "form-control" %>

奇怪的是:category不存在,因为列应该是:name。在我的seeds.rb 中,我插入了以下内容,在rake db:seed 之后运行良好

Category.create(name: 'PHP')

Category.create(name: 'Ruby')

Category.create(name: 'HTML')

Category.create(name: 'ASP')

Category.create(name: 'C#')

Category.create(name: 'C++')

但上面带有:category 的代码显示了这一点:

种子文件中有所有 6 个类别,但不是类别的实际名称(如“PHP”)。如果我在这段代码中使用:name 而不是:category

<%= f.select :category, Category.all, :prompt => "Kategorie", class: "form-control" %>

我得到了一个

undefined method `name' for #<Request:0x007ff504266b40>

我的分类表:

Category(id: integer, name: string, description: text, created_at: datetime, updated_at: datetime)

保存后如何调用特定请求的类别? @Category.request?

我真的很困惑(抱歉,我是从 8 月下旬才开始学习 Rails)。

提前致谢!

【问题讨论】:

    标签: ruby-on-rails models


    【解决方案1】:

    如果我理解正确,因为一个请求属于一个类别,一个类别可以有多个请求,所以应该这样设置关联:

    class Request < ActiveRecord::Base
      belongs_to :category
    end
    
    class Category < ActiveRecord::Base
      has_many :requests
    end
    

    像这样,请求表中的条目将具有该类别的外键 category_id。

    您还可以在Active Record Associations Guide 中阅读有关关联基础知识的大量内容

    保存后如何调用特定请求的类别? @Category.request ?

    要获取特定请求的类别,您必须从请求开始,例如:

    @request = Request.first
    @reqest.category
    

    在您的表单中,如果您想像这样使用选择标签,您可能必须使用category_id

    <%= f.select :category_id, Category.all.map { |c| [c.name, c.id] }, :prompt => "Kategorie", class: "form-control" %>
    

    地图将确保它将使用标签的名称和您选择的值的 id。

    为了更轻松地为关联和其他内容生成表单,您还可以查看 gem simple_form。那么你只需要使用:

    <%= f.association :category %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多