0

私は、NoSQL ドキュメントの有機的な特徴を最大限に活用し、成長、変更可能で、ほとんどのデータセットとは異なる動的データ モデルを構築したいと考えています。以下は、Couchbase から設定および取得するコードを含むモデル SomeRequest.rb ですが、機能する関数 addOrUpdate(key, value) を取得できません。

undefined method `each' for "0":String 

Completed 500 Internal Server
Error in 16ms NoMethodError (undefined method `each' for "0":String): 
config/initializers/quiet_assets.rb:7:in `call_with_quiet_assets'

リターンエラーです。これを機能させ、キーを追加 (または既存のものを更新) し、後でドキュメントをデータベースに保存する方法はありますか?

class SomeRequest < Couchbase::Model
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Callbacks
  extend ActiveModel::Naming

  # Couch Model
  define_model_callbacks :save

  attribute :session_id
  attribute :views, :default => 0
  attribute :created_at, :default => lambda { Time.zone.now }

  # iterate through attr keys and set instance vars
  def initialize(attr = {})
    @errors = ActiveModel::Errors.new(self)
    unless attr.nil?
      attr.each do |name, value|
        setter = "#{name}="
        next unless respond_to?(setter)
        send(setter, value)
      end
    end
  end

  def addOrUpdate(key, value)
    self[key] = value
  end

  def save
    return false unless valid?
    run_callbacks :save do
      Couch.client.set(self.session_id, self)
    end
    true
  end

  def self.find(key)
    return nil unless key
    begin
      doc = Couch.client.get(key)
      self.new(doc)
    rescue Couchbase::Error::NotFound => e
      nil
    end
  end
end
4

1 に答える 1

0

couchbase-model gem の find、save、create メソッドを使用してみませんか?

class Couchbase::Error::RecordInvalid < Couchbase::Error::Base
  attr_reader :record

  def initialize(record)
    @record = record
    errors = @record.errors.full_messages.join(", ")
    super("Record Invalid: #{errors}")
  end
end

class SomeRequest < Couchbase::Model
  include ActiveModel::Validations

  attribute :session_id
  attribute :views, :default => 0
  attribute :created_at, :default => lambda { Time.zone.now }

  validates_presence_of :session_id

  before_save do |doc|
    if doc.valid?
      doc
    else
      raise Couchbase::Error::RecordInvalid.new(doc)
    end
  end

  def initialize(*args)
    @errors = ActiveModel::Errors.new(self)
    super
  end

end

そうかもしれませんが、デフォルトで検証フックを追加する価値はあります。次のリリースで追加すると思います。上記の例はリリース 0.3.0 で有効です

メソッドを使用することupdateOrAddをお勧めします#save。キーが永続化されているかどうかを確認し(現在はid属性を確認することにより)、レコードにまだキーがない場合は、キーを生成して更新します。

アップデート

バージョン0.4.0では検証フックを gem に追加したので、上記の例はより簡単に書き直すことができます。

class SomeRequest < Couchbase::Model
  attribute :session_id
  attribute :views, :default => 0
  attribute :created_at, :default => lambda { Time.zone.now }

  validates_presence_of :session_id
end
于 2012-09-25T20:49:30.987 に答える