6

MODEL1 には account_type があるため、gem 'enumerated_attributes' を使用して、モデルを次のように作成しました。

class MODEL1 < ActiveRecord::Base

  enum_attr :account_type, %w(^live demo disabled)

  def is_live?
    self.account_type == :live
  end
  def is_not_live?
    self.account_type == :demo || self.account_type == :disabled
  end
end

私が理解していない奇妙なことは、このようなシードの任意の MODEL1 を照会するときです (これは、rubymine コンソールで次のコマンドを実行したときのエラーですが、この同じ 2 対 1 エラーは rake db:seed 中に発生します) :

MODEL1.all.sample

MODEL1.all

私はこれを得る:

Dealer Load (0.3ms)  SELECT "MODEL1".* FROM "MODEL1S"
ArgumentError: wrong number of arguments (2 for 1)
from /.rvm/gems/ruby-2.0.0-p0@web/gems/enumerated_attribute-0.2.16/lib/enumerated_attribute/integrations/active_record.rb:78:in `instantiate'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/querying.rb:45:in `block in find_by_sql'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/result.rb:21:in `block in each'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/result.rb:21:in `each'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/result.rb:21:in `each'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/querying.rb:45:in `map'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/querying.rb:45:in `find_by_sql'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/relation.rb:585:in `exec_queries'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/relation.rb:471:in `load'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/relation.rb:220:in `to_a'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/activerecord-4.0.0/lib/active_record/relation/delegation.rb:49:in `sample'
from (irb):7
from /.rvm/gems/ruby-2.0.0-p0@web/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
from /.rvm/gems/ruby-2.0.0-p0@web/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'

シードしようとしているモデル (rake db:seed 中にエラーが発生する場所) は次のとおりです。

  model2 = Fabricate(:MODEL2, name: "Any MODEL2 Name #{n}", cost: n, MODEL1: MODEL1.all.sample)

MODEL2 モデルで

belongs_to :MODEL1

MODEL1 モデルでは

has_many :MODEL2s

移行では、MODEL2

t.references :MODEL1

移行では、MODEL1

t.enum :account_type

MODEL1 の account_types を指定する簡単な方法があれば、教えてください。MODEL1.all.sample または MODEL1.all と言えればいいだけです。

4

1 に答える 1

1

リリースノートからRails 4を使用しているようです:

Model.all は、レコードの配列ではなく、ActiveRecord::Relation を返すようになりました。本当に配列が必要な場合は、Relation#to_a を使用してください。一部の特定のケースでは、これによりアップグレード時に破損が発生する可能性があります。

to_aそのため、まずモデルを呼び出す必要があります。しかし、enumerated_attribute は Rails 4 に対応していますか?

postres を使用していない場合は、validates_inclusion_of のみを使用することをお勧めします。postgres を使用している場合は、https://coderwall.com/p/azi3ka を確認してください。

于 2013-09-25T11:27:50.897 に答える