【问题标题】:How to choose a continent by the country?国家如何选择大陆?
【发布时间】:2019-08-15 14:49:57
【问题描述】:

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

【问题讨论】:

  • @jvillian 我想知道我是否朝着正确的方向前进
  • 你正在向a方向移动。是否是正确方向很难说。有不止一种方法可以完成您正在尝试做的事情。与另一种方法相比,是什么让一种方法“正确”?这段代码看起来很接近。所以,也许是的,你正朝着正确的方向前进。除了,显然,您将“纽约”和“芝加哥”存储为国家。但是,这更像是一个语义问题而不是句法问题。
  • 您还没有告诉我们您的代码是否有效,如果无效,或者发生了什么错误。

标签: ruby-on-rails mongoid


【解决方案1】:

既然你表明你正在使用 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. 正如 Toby 所指出的,case 语句没有正确使用。它的结果应该是这样分配的:

.

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

【讨论】:

  • 感谢帮助),我忘了after_save 不起作用
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多