如何按国家选择大洲?

时间:2019-08-15 14:49:57

标签: ruby-on-rails mongoid

我使用Ruby on Rails 5.2和mongoid 7.0

我需要按国家/地区选择一个大陆

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

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

2 个答案:

答案 0 :(得分:0)

您没有给出足够的上下文来回答您的问题,但是由于您只是想朝正确的方向指路,而且由于您似乎是新手,因此我很乐意为您提供一些指导。 / p>

  1. 您正在使用after_save方法,就好像它是ActiveRecord模型一样,但是没有扩展或包含任何内容,它只是一个普通的旧Ruby对象。要使after_save回调起作用,您至少需要扩展ActiveModel::Callbacks,但可能要使其成为完整的ActiveRecord模型。为此,您可以在Rails 4中将ActiveRecord::Base子类化,而在Rails 6中将ApplicationRecord子类化,但是我实际上不知道在Rails 5中是如何完成的。

  2. 如果像Rails一样通常在后端使用普通数据库,则无需声明字段,它会自动从数据库中的等效表中获取它们(尽管当使用Mongoid(我不知道)。如果您在终端的应用程序基本目录中运行此命令:rails generate model Place country:string continent:string,它将创建制作数据库表和模型文件(带有正确的超类的东西)所需的迁移文件,并且您无需执行所有操作样板填满自己。

  3. 您有一个名为cont的变量,并为其分配了一个国家。鉴于您也有一个单独的“大陆”概念,这将使您非常困惑。最好不要缩写变量名并选择合理的命名。

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

  5. 总体而言,从长远来看,我怀疑为大陆和国家/地区使用单独的模型会很不错。一个拥有许多国家和一个大洲的国家的大陆。 Rails是一个使这类事情非常容易执行和管理的框架。您可能需要阅读更多内容,并查看有关Ruby on Rails基础的示例和视频。

我强烈推荐Hartl的The Rails Tutorial。它是免费的在线。通过这一工作或等效工作可以使您更好地了解Rails如何处理您的情况,以及如何最好地利用它来获得所需的结果。当我刚开始使用Rails时,这对我来说是必不可少的。

答案 1 :(得分:0)

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

  1. 根据https://docs.mongodb.com/mongoid/master/tutorials/mongoid-documents/中的文档,每个Mongoid模型类都必须include Mongoid::Document

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

  3. 如Toby所指出,case语句未正确使用。其结果应按以下方式分配:

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