如何按国家选择大洲?



我使用 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

既然你表示你正在使用Mongoid:

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

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

  3. 正如托比所指出的,案例陈述没有正确使用。它的结果应该像这样分配:

.

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

你没有给出足够的背景来回答你的问题,但既然你只是想被指向正确的方向,而且你似乎是新来的,我很乐意给你一些指示。

  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 时,这对我来说是必不可少的。

最新更新