0

私はActiveModelを使用して、テーブルレスモデルをActiveRecordモデルのように感じさせています。カスタムストアを使用していますが、レコードの一意性を検証できる必要があります。

ActiveModelを使用して必要な一意性チェックを実装するにはどうすればよいですか?

4

3 に答える 3

1

私は最終的に次のようなことをしました:

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

これが正しい方法だったかどうか、誰かが教えてくれるかもしれません

于 2012-09-18T01:40:14.423 に答える
0

ActiveModel は、そのユースケースにより適した別のrailscastsに従って使用できます。

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
于 2012-09-18T04:39:06.903 に答える
0

このレールキャストをチェックしてください、役立つかもしれません

http://railscasts.com/episodes/193-tableless-model

モデルを作成したら、検証を追加してから @model.valid?

于 2012-09-18T01:25:41.447 に答える