Ruby on rails 如何使用ActiveModel验证唯一性?

Ruby on rails 如何使用ActiveModel验证唯一性?,ruby-on-rails,ruby-on-rails-3,activerecord,activemodel,Ruby On Rails,Ruby On Rails 3,Activerecord,Activemodel,我使用ActiveModel使我的无表模型感觉像ActiveRecord模型。我正在使用自定义存储,我需要能够验证记录的唯一性 如何使用ActiveModel实现所需的唯一性检查?检查此railscasts,可能会有所帮助 完成模型后,添加验证,然后@model.valid?我最后做了如下操作: class Theme < Base include ActiveModel::Validations attr_accessor :id, :name validate

我使用ActiveModel使我的无表模型感觉像ActiveRecord模型。我正在使用自定义存储,我需要能够验证记录的唯一性


如何使用ActiveModel实现所需的唯一性检查?

检查此railscasts,可能会有所帮助


完成模型后,添加验证,然后@model.valid?

我最后做了如下操作:

class Theme < Base

  include ActiveModel::Validations

  attr_accessor :id, :name
  validate      :uniqueness_of_theme_name, :on => :create

  def initialize(attrs = {})
    attrs.each do |name, value|
      send("#{name}=", value)
    end
  end

  def uniqueness_of_theme_name
    errors.add(:name, "name is already in use") unless Theme.find_by_name(name).nil?
  end

  def self.find_by_name(name)
    return store.find({ 'name' => "/^#{name}$/i" }).any?
  end

  def self.create(attributes = {})
    theme = Theme.new(attributes)
    theme.save

    return theme
  end

  def persisted?
    id && !id.nil?
  end

  def save()
    # only call validation during create context
    context = persisted? :update : :create
    false if invalid?(context)
    store.save(self)
    true
  end

  def self.create(attrs = {})
    theme = Theme.new(attrs)
    theme.save
    theme
  end

end
类主题:create
def初始化(属性={})
属性。每个do |名称、值|
发送(“#{name}=”,值)
结束
结束
定义主题名称的唯一性
错误。添加(:name,“name已在使用”)除非主题。按\ u name(name)查找\ u。nil?
结束
定义self.find_by_name(name)
return store.find({'name'=>“/^{name}$/i“})。有吗?
结束
def self.create(attributes={})
主题=主题。新建(属性)
主题。保存
返回主题
结束
def持续存在?
id&!无身份证?
结束
def save()
#仅在创建上下文期间进行调用验证
上下文=持久化?:更新::创建
如果无效,则为false?(上下文)
存储。保存(自我)
真的
结束
def self.create(attrs={})
主题=主题。新建(属性)
主题。保存
主题
结束
结束

也许有人可以告诉我这是否是正确的方法

根据另一个更适合该用例的方法,ActiveModel可以与一起使用

class Theme

  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :id, :name

  validates :name, uniqueness: true, on: :create

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def persisted?
    false
  end
end

我知道该教程是关于无表模型的,但它没有任何唯一性检查的示例。我不明白,您将这些主题存储在哪里,以便验证其唯一性,@RodrigoZurek,我的商店实际上是mongodb。我已经更新了上面的代码。它还不完整,但应该给你一个更好的想法。你的基类包括什么?基类包括一些让模型与之交互的基本代码mongodb@mikhailob,基于什么,上述代码检查
:name
的唯一性?我认为验证唯一性是一种特殊情况,在这种情况下,唯一性的正确性在很大程度上依赖于数据存储,并且不可能被抽象到根本不需要表的ActiveModel中。@Arman ActiveModel验证会在调用save(或显式valid?方法)后发生在尝试将数据保存到MongoDB(或任何您想要的)之前,在Ruby对象上。ActiveModel是一种抽象,它可以帮助您在模型后面使用像ActiveRecord表这样的普通对象。