如何按国家选择大洲?
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
您没有提供足够的上下文来回答您的问题,但由于您只是想指出正确的方向,而且您似乎是新来的,我很乐意为您提供一些指导.
你 class 使用 after_save
方法就好像它是一个 ActiveRecord 模型,但没有扩展或包含任何东西它只是一个普通的旧 Ruby目的。要使 after_save
回调正常工作,您至少需要扩展 ActiveModel::Callbacks
,但您可能希望使其成为完整的 ActiveRecord 模型。要在 Rails 4 中做到这一点,你需要 subclass ActiveRecord::Base
并且在 rails 6 中你需要 subclass ApplicationRecord
但我实际上不知道如何它在 Rails 5.
中完成
如果你在后端有一个正常的数据库,就像 rails 一样,你不需要声明字段,它会自动从等效的 table 在数据库中(尽管使用 Mongoid 时可能不是这样。我不知道)。如果您 运行 在您的应用程序基目录中的终端中执行此命令:rails generate model Place country:string continent:string
它将创建制作数据库 table 和模型文件所需的迁移文件(使用正确的 superclass 是)并且您不需要自己完成所有样板文件。
您有一个名为 cont
的变量,并为其分配了一个国家/地区。这将变得非常混乱,因为您还有一个单独的概念 "continent" 最好不要缩写您的变量名称并选择合理的命名。
您没有正确使用 case 语句。语句的输出不会自动分配给您正在打开的变量。您需要阅读 Ruby 语法。
总的来说,我怀疑在长期 运行 中,您最好为大陆和国家/地区拥有单独的模型。一个大陆有很多国家,一个国家属于一个大陆。 Rails 是一个框架,可以让这类事情变得非常容易做和管理。您可能需要在 Rails.
上阅读更多内容并查看有关 Ruby 基础知识的示例和视频
我强烈推荐 Hartl 的 The Rails Tutorial。在线免费。完成该工作或同等工作应该可以让您更好地了解 Rails 是如何处理您的情况的,以及如何最好地利用它来获得您需要的结果。当我刚开始使用 Rails.
时,这对我来说是必不可少的
由于您表示您正在使用 Mongoid:
每个 Mongoid 模型 class 必须 include Mongoid::Document
,根据 https://docs.mongodb.com/mongoid/master/tutorials/mongoid-documents/.
中的文档
after_save
回调通常用于创建外部作业之类的事情,而不是用于设置属性,因为属性更改不会持久化(因为模型已经保存)。通常属性更改在 before_validation
或 before_save
回调中完成。有关可用回调的列表,请参阅 https://guides.rubyonrails.org/active_record_callbacks.html。
正如 Toby 所指出的,case 语句没有被正确使用。它的结果应该这样赋值:
.
def update_continent
self.continent = case self.country
when 'United States', 'Grenada'
'NA'
when 'Netherlands', 'Spain'
'EU'
end
end
我在 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
您没有提供足够的上下文来回答您的问题,但由于您只是想指出正确的方向,而且您似乎是新来的,我很乐意为您提供一些指导.
你 class 使用
after_save
方法就好像它是一个 ActiveRecord 模型,但没有扩展或包含任何东西它只是一个普通的旧 Ruby目的。要使after_save
回调正常工作,您至少需要扩展ActiveModel::Callbacks
,但您可能希望使其成为完整的 ActiveRecord 模型。要在 Rails 4 中做到这一点,你需要 subclassActiveRecord::Base
并且在 rails 6 中你需要 subclassApplicationRecord
但我实际上不知道如何它在 Rails 5. 中完成
如果你在后端有一个正常的数据库,就像 rails 一样,你不需要声明字段,它会自动从等效的 table 在数据库中(尽管使用 Mongoid 时可能不是这样。我不知道)。如果您 运行 在您的应用程序基目录中的终端中执行此命令:
rails generate model Place country:string continent:string
它将创建制作数据库 table 和模型文件所需的迁移文件(使用正确的 superclass 是)并且您不需要自己完成所有样板文件。您有一个名为
cont
的变量,并为其分配了一个国家/地区。这将变得非常混乱,因为您还有一个单独的概念 "continent" 最好不要缩写您的变量名称并选择合理的命名。您没有正确使用 case 语句。语句的输出不会自动分配给您正在打开的变量。您需要阅读 Ruby 语法。
总的来说,我怀疑在长期 运行 中,您最好为大陆和国家/地区拥有单独的模型。一个大陆有很多国家,一个国家属于一个大陆。 Rails 是一个框架,可以让这类事情变得非常容易做和管理。您可能需要在 Rails.
上阅读更多内容并查看有关 Ruby 基础知识的示例和视频
我强烈推荐 Hartl 的 The Rails Tutorial。在线免费。完成该工作或同等工作应该可以让您更好地了解 Rails 是如何处理您的情况的,以及如何最好地利用它来获得您需要的结果。当我刚开始使用 Rails.
时,这对我来说是必不可少的由于您表示您正在使用 Mongoid:
每个 Mongoid 模型 class 必须
include Mongoid::Document
,根据 https://docs.mongodb.com/mongoid/master/tutorials/mongoid-documents/. 中的文档
after_save
回调通常用于创建外部作业之类的事情,而不是用于设置属性,因为属性更改不会持久化(因为模型已经保存)。通常属性更改在before_validation
或before_save
回调中完成。有关可用回调的列表,请参阅 https://guides.rubyonrails.org/active_record_callbacks.html。正如 Toby 所指出的,case 语句没有被正确使用。它的结果应该这样赋值:
.
def update_continent
self.continent = case self.country
when 'United States', 'Grenada'
'NA'
when 'Netherlands', 'Spain'
'EU'
end
end