我使用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
答案 0 :(得分:0)
您没有给出足够的上下文来回答您的问题,但是由于您只是想朝正确的方向指路,而且由于您似乎是新手,因此我很乐意为您提供一些指导。 / p>
您正在使用after_save
方法,就好像它是ActiveRecord模型一样,但是没有扩展或包含任何内容,它只是一个普通的旧Ruby对象。要使after_save
回调起作用,您至少需要扩展ActiveModel::Callbacks
,但可能要使其成为完整的ActiveRecord模型。为此,您可以在Rails 4中将ActiveRecord::Base
子类化,而在Rails 6中将ApplicationRecord
子类化,但是我实际上不知道在Rails 5中是如何完成的。
如果像Rails一样通常在后端使用普通数据库,则无需声明字段,它会自动从数据库中的等效表中获取它们(尽管当使用Mongoid(我不知道)。如果您在终端的应用程序基本目录中运行此命令:rails generate model Place country:string continent:string
,它将创建制作数据库表和模型文件(带有正确的超类的东西)所需的迁移文件,并且您无需执行所有操作样板填满自己。
您有一个名为cont
的变量,并为其分配了一个国家。鉴于您也有一个单独的“大陆”概念,这将使您非常困惑。最好不要缩写变量名并选择合理的命名。
您没有正确使用case语句。语句的输出不会自动分配给您要打开的变量。您需要阅读Ruby语法。
总体而言,从长远来看,我怀疑为大陆和国家/地区使用单独的模型会很不错。一个拥有许多国家和一个大洲的国家的大陆。 Rails是一个使这类事情非常容易执行和管理的框架。您可能需要阅读更多内容,并查看有关Ruby on Rails基础的示例和视频。
我强烈推荐Hartl的The Rails Tutorial。它是免费的在线。通过这一工作或等效工作可以使您更好地了解Rails如何处理您的情况,以及如何最好地利用它来获得所需的结果。当我刚开始使用Rails时,这对我来说是必不可少的。
答案 1 :(得分:0)
由于您指示您正在使用Mongoid:
根据https://docs.mongodb.com/mongoid/master/tutorials/mongoid-documents/中的文档,每个Mongoid模型类都必须include Mongoid::Document
。
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