如何按国家选择大洲?

How to choose a continent by the country?

我在 Rails 5.2 和 mongoid 7.0

上使用 Ruby

我需要按国家选择大洲

我知道它应该看起来像这样:

class Place
  field :country, type: String
  field :continent, type: String

  after_save :update_continent

  def update_continent
    cont = self.country

    case cont
    when 'United States', 'Grenada'
      'NA'
    when 'Netherlands', 'Spain'
      'EU'
    end

    self.continent = cont
  end

 end

您没有提供足够的上下文来回答您的问题,但由于您只是想指出正确的方向,而且您似乎是新来的,我很乐意为您提供一些指导.

  1. 你 class 使用 after_save 方法就好像它是一个 ActiveRecord 模型,但没有扩展或包含任何东西它只是一个普通的旧 Ruby目的。要使 after_save 回调正常工作,您至少需要扩展 ActiveModel::Callbacks,但您可能希望使其成为完整的 ActiveRecord 模型。要在 Rails 4 中做到这一点,你需要 subclass ActiveRecord::Base 并且在 rails 6 中你需要 subclass ApplicationRecord 但我实际上不知道如何它在 Rails 5.

  2. 中完成
  3. 如果你在后端有一个正常的数据库,就像 rails 一样,你不需要声明字段,它会自动从等效的 table 在数据库中(尽管使用 Mongoid 时可能不是这样。我不知道)。如果您 运行 在您的应用程序基目录中的终端中执行此命令:rails generate model Place country:string continent:string 它将创建制作数据库 table 和模型文件所需的迁移文件(使用正确的 superclass 是)并且您不需要自己完成所有样板文件。

  4. 您有一个名为 cont 的变量,并为其分配了一个国家/地区。这将变得非常混乱,因为您还有一个单独的概念 "continent" 最好不要缩写您的变量名称并选择合理的命名。

  5. 您没有正确使用 case 语句。语句的输出不会自动分配给您正在打开的变量。您需要阅读 Ruby 语法。

  6. 总的来说,我怀疑在长期 运行 中,您最好为大陆和国家/地区拥有单独的模型。一个大陆有很多国家,一个国家属于一个大陆。 Rails 是一个框架,可以让这类事情变得非常容易做和管理。您可能需要在 Rails.

  7. 上阅读更多内容并查看有关 Ruby 基础知识的示例和视频

我强烈推荐 Hartl 的 The Rails Tutorial。在线免费。完成该工作或同等工作应该可以让您更好地了解 Rails 是如何处理您的情况的,以及如何最好地利用它来获得您需要的结果。当我刚开始使用 Rails.

时,这对我来说是必不可少的

由于您表示您正在使用 Mongoid:

  1. 每个 Mongoid 模型 class 必须 include Mongoid::Document,根据 https://docs.mongodb.com/mongoid/master/tutorials/mongoid-documents/.

  2. 中的文档
  3. after_save 回调通常用于创建外部作业之类的事情,而不是用于设置属性,因为属性更改不会持久化(因为模型已经保存)。通常属性更改在 before_validationbefore_save 回调中完成。有关可用回调的列表,请参阅 https://guides.rubyonrails.org/active_record_callbacks.html

  4. 正如 Toby 所指出的,case 语句没有被正确使用。它的结果应该这样赋值:

.

def update_continent
  self.continent = case self.country
  when 'United States', 'Grenada'
    'NA'
  when 'Netherlands', 'Spain'
    'EU'
  end
end