【问题标题】:Rails Model ConstantsRails 模型常量
【发布时间】:2016-06-10 01:02:19
【问题描述】:

我有附件和类别模型,因此当用户上传文件时,他们可以为该附件选择一个类别。我现在希望类别是静态的。关于如何创建静态类别模型选项的建议? 我现在有这个,但我收到以下错误:undefined method 'title' for Syllabus":String

类别模型

class Category < ActiveRecord::Base
  CATEGORY = ['Syllabus', 'Assignments', 'Handouts', 'Lectures', 'Other']
  has_many :attachments
end

附件new.html.erb

<%= simple_form_for([@group, @group.attachments.build]) do |f| %>

  <%= f.collection_select :category_id, Category::CATEGORY, :id, :title, { promt: "Choose a Category" } %>

<%= f.submit %>

<% end %>

附件模型

class Attachment < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
  belongs_to :category
end

架构

 create_table "categories", force: :cascade do |t|
    t.string   "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

 create_table "attachments", force: :cascade do |t|
    t.string   "title"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "user_id"
    t.string   "name"
    t.integer  "group_id"
    t.integer  "category_id"
 end

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您似乎希望有一个固定的类别列表,但可能为了将来的扩展,您希望通过belongs_tocategory_id 模型中的attachments 引用这些类别。您无法提前知道 category_id 对您的数据库引擎或其他任何人的数据库引擎的价值,如果它们是真实创建的,它们可能会分配给 Category 对象。

    您收到错误是因为collection_select 期望您提供给它的集合包含真实的类别模型实例,这些实例具有由关联数据库表的属性产生的#title 等方法。相反,你只是想给它一个字符串数组。

    因此,您应该使用种子数据 - 谷歌搜索“rails 4 种子数据”之类的内容,以了解该做什么。使用种子数据,您实际上将创建该类别模型的真实数据库实例,这些实例会作为应用程序安装阶段的一部分加载。该模型在您的应用程序的早期版本中没有任何编辑/管理界面,但它的真实实例仍然存在于数据库中。

    [编辑:我通常更喜欢rake db:create db:migrate 方法来启动应用程序,因为db:schema:load 可能并不总是有效,尤其是在迁移文件中出现深奥的 ID 列结构时,schema.rb 摘要文件可能不准确由于 Rails 错误而记录。因此,我更喜欢使用我在一个非常古老的 StackOverflow 问题的答案中描述的方法 - Add Rows on Migrations - 但是 YMMV,您可能更喜欢 seeds.rb 之类的东西。]

    【讨论】:

      【解决方案2】:

      在我看来,Category::CATEGORY 应该是一个枚举。至少有两种方法可以实现您想要的:

      1. 单表继承:http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html
      2. 枚举:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

      如果您对指南有任何疑问,请询问。

      【讨论】:

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