ruby-on-rails - 多个 Rails 模型中的性别验证

标签 ruby-on-rails data-modeling

大家好——这个问题专门针对 gender验证,但我很想听听你们如何处理具有更大集合的类似情况(例如,国家选择。)

我正在开发一个系统,让运动员可以注册各种赛事,目前正在努力进行良好的性别验证。我的问题是,在许多不同模型上运行相同验证的最佳、最干燥的方法是什么?

假设我要验证 Event 的性别属性和 User .我可以为 validates_each 创建一个助手在更新 gender 之前检查值是否包含在 ["male", "female"] 的非常短的数组中属性。但是,如果我想在 form_for 中访问同一个性别数组怎么办? block ,例如,作为 collection_select 的输入?

我让它适用于一个模型——我声明一个 GENDERS Event 中的常量, 并且有一个简短的类方法

def self.genders
    GENDERS
end

通过表格访问。但是,如果多个模型需要访问,我应该将数组存储在哪里?

编辑:一个想法是在应用程序 Controller 中使用类方法。任何关于这种方法有多合适的想法都会很棒。

最佳答案

这是我的解决方案。我喜欢使用标准的插件式库。我会把它放在 lib/acts_as_gendered 中:

module ActsAsGendered
  GENDERS = ['male', 'female']

  def self.included(base)
    base.extend(ActsAsGenderedMethods)
  end

  module ActsAsGenderedMethods
    def acts_as_gendered
      extend ClassMethods
      include InstanceMethods

      validates_inclusion_of :gender, :in => GENDERS
    end
  end

  module ClassMethods
    def is_gendered?
      true
    end
  end

  module InstanceMethods
    def is_male
      gender = 'male'
    end

    def is_female
      gender = 'female'
    end

    def is_male?
      gender == 'male'
    end

    def is_female?
      gender == 'female'
    end
  end
end

是的,这对于简单的性别来说可能有点过头了,但你可以看到所有部分的去向——GENDERS 常数,acts_as_gendered ActiveRecord 钩子(Hook),然后包括类和实例方法以及验证。

然后,在 config/initializers/gender.rb 中:
require 'acts_as_gendered'
ActiveRecord::Base.send(:include, ActsAsGendered)

然后,对于压轴戏,模特:
class User < ActiveRecord::Base
  acts_as_gendered
end

这种模式可能看起来过于复杂,但大多数库最终都是这样 :)

更新:为了回答您的评论,这就是我修改acts_as_gendered 方法以在每个模型的基础上使验证成为可选的方式:
def acts_as_gendered options={}
  config = {:allow_nil => false}
  config.merge(options) if options.is_a?(Hash)

  extend ClassMethods
  include InstanceMethods

  if config[:allow_nil]
    validates_inclusion_of :gender, :in => (GENDERS + nil)
  else
    validates_inclusion_of :gender, :in => GENDERS
  end
end

现在您可以像这样在 User 模型中调用它:
class User < ActiveRecord::Base
  acts_as_gendered :allow_nil => true
end

我本可以将其设为您传入的简单参数,但我喜欢传入哈希的清晰性。它使您可以在以后添加其他选项。

关于ruby-on-rails - 多个 Rails 模型中的性别验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4383409/

相关文章:

html - 如何创建包含图像和文本的按钮

android - 将 Android 应用程序(客户端)与 rails server-rails 3,android 连接

ruby-on-rails - acts_as_tree 并通过子标题将值传播到项目

mysql - 将多个数据存储到一个字段中以便更好地管理?

database - 我如何有效地检查 RavenDB 中文档的存在

ruby-on-rails - 在 ruby​​ on rails 中使用 has_many 和使用数组有什么区别? (MongoDB)

ruby-on-rails - 扩展 ActiveRecord::Base 的正确方法

sql - 检查我的数据库设计/PHP/MySQL

mysql - 如何设置具有类的三个实体之间的关系

arrays - 如何使用嵌套类型正确编写数据模型或在 Swift 中使用 CoreData