1

私は Web サービスのクライアントを作成しています。そのモデルの一部は、ユーザーが使用した以前のユーザー名を含むユーザーに属する文字列のリストです。クライアントの宝石に DataMapper を使用しようとしています。最初に考えたのは、DataMapper の has n 構文を使用することでしたが、これを文字列に適用できないようです。おそらくこれを行うより良い方法はありますか?

私の現在のコード:

class User
  include DataMapper::Resource

  # Some Properties here

  has n, :also_known_as, 'String'
end

これが生成するエラーは次のとおりです。

irb(main):001:0> require 'cloudsdale'
NoMethodError: undefined method `relationships' for String:Class
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/associations/one_to_many.rb:109:in `finalize'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/model.rb:782:in `block in finalize_relationships'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/subject_set.rb:210:in `block in each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/ordered_set.rb:319:in `block in each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/ordered_set.rb:319:in `each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/ordered_set.rb:319:in `each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/subject_set.rb:210:in `each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/model.rb:782:in `finalize_relationships'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/model.rb:137:in `finalize'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core.rb:281:in `block in finalize'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/descendant_set.rb:64:in `block in each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/subject_set.rb:210:in `block in each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/ordered_set.rb:319:in `block in each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/ordered_set.rb:319:in `each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/ordered_set.rb:319:in `each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/subject_set.rb:210:in `each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core/support/descendant_set.rb:63:in `each'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/dm-core-1.2.0/lib/dm-core.rb:281:in `finalize'
    from C:/Ruby193/lib/ruby/gems/1.9.1/gems/cloudsdale-0.0.1/lib/cloudsdale.rb:19:in `<top (required)>'
    from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in `require'
    from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:60:in `rescue in require'
    from C:/Ruby193/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
    from (irb):1
    from C:/Ruby193/bin/irb:12:in `<main>'irb(main):002:0>

エラーが生成されるファイルは次のとおりです。

# Load in DataMapper
# Change the setup to meet your DB needs
require 'data_mapper'
DataMapper.setup(:default, 'abstract::')

# API objects
require 'cloudsdale/version'
require 'cloudsdale/api/api'
require 'cloudsdale/client'

# Models
require 'cloudsdale/models/user'
require 'cloudsdale/models/cloud'
require 'cloudsdale/models/avatar'
require 'cloudsdale/models/ban'
require 'cloudsdale/models/chat'

# Finalize DataMapper so the models Load
DataMapper.finalize
4

2 に答える 2

0

なぜ'String'ここを使うのですか?

has n, :also_known_as, 'String'

意味がないので、削除してください:

has n, :also_known_as

モデルを設定する場合は、次の:modelオプションを使用します。

has n, :also_known_as, :model => ModelName

Stringモデル名として使用するかどうかはわかりません。

ユーザーの以前の名前を保持するには、おそらく追加のモデルが必要です。

class UserAlias
  include DataMapper::Resource

  # ...
end


class User
  include DataMapper::Resource

  # ...

  has n, :also_known_as, :model => UserAlias
end
于 2012-12-08T10:43:12.460 に答える
0

datamapper 1.x クエリ DSL を介して古いユーザー名を検索できるようにする場合は、追加のモデルを定義する必要があります。

class User
  include DataMapper::Resource

  # ...

  has n, :also_known_as, :model => UserNameHistory
end

class UsernameHistory
  include DataMapper::Resource
  property :id, Serial
  property :name
  belongs_to :user
end

古いユーザー名でクエリを実行する必要がない場合は、シリアル化されたラージ オブジェクトを使用できます。提案として、次のようにDataMapper::Property::YAMLfromを使用できます。dm-types

class User
  include DataMapper::Resource

  # ...

  property :also_known_as, YAML
end
于 2012-12-14T19:32:36.333 に答える