2013-08-31 17 views
6

A model1 ma ACCOUNT_TYPE, więc używając gem 'enumerated_attributes', zrobiłem model jako takie:Zła liczba argumentów podczas wywoływania .all na płycie, która enum_attr

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 

Najdziwniejsze I don” Rozumiemy, że gdy wysyłam zapytanie do dowolnego MODEL1 dla takich nasion (jest to błąd, gdy uruchamiam następujące polecenie w konsoli rubymine, ale ten sam błąd 2 na 1 dzieje się podczas rake db: seed):

MODEL1.all.sample 

I

MODEL1.all 

uzyskać to:

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

Model Próbuję nasion (gdzie błąd występuje podczas rake db: nasion) jest taki:

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

w modelu MODEL2

belongs_to :MODEL1 

aw modelu model1

has_many :MODEL2s 

w migracji, MODEL2

t.references :MODEL1 

w migracji, model1

t.enum :account_type 

Jeśli istnieje łatwiejszy sposób określić account_types dla modelu MODEL1, proszę dać mi znać, po prostu trzeba być w stanie powiedzieć MODEL1.all.sample lub MODEL1.all

+0

Spojrzałem na kodzie źródłowym na górze ślad stosu (patrz https: // github .com/jeffp/enumerated_attribute/blob/84221b872f7f71152994b212520c833742a263e3/lib/enumerated_attribute/integrations/active_record.rb) i rzeczywiście istnieje wywołanie metody z dwoma argumentami w wierszu 78, ale nie mogę zrozumieć, jak moje życie wywoływana metoda ('write_enumerated_attribute') mogła zostać zdefiniowana za pomocą jednego. –

+0

Czy łatwiej byłoby zdefiniować account_type inaczej dla MODEL1? Czuję, że powinien to być wyliczony atrybut, ale jeśli istnieje równie odpowiednie rozwiązanie, które nie powoduje tego problemu, jestem szczęśliwy, aby spróbować? – JPEasy

+0

Twój klejnot to 0.2.16, a na Githubie to 0.3.1beta. Czy możesz spróbować ulepszyć swój klejnot? – j03w

Odpowiedz

1

Wygląda na to, że używasz Rails 4, który z informacji o wydaniu:

Model.all zwraca obecnie właściwość ActiveRecord :: Relation, a nie tablicę rekordów. Użyj Relacji # do_a, jeśli naprawdę chcesz tablicy. W niektórych szczególnych przypadkach może to spowodować uszkodzenie podczas aktualizacji.

Na początek warto zadzwonić pod numer to_a w modelu. Ale czy jesteś pewny, że enumerated_attribute jest gotowy na szynę 4?

Jeśli nie używasz Postres Polecam tylko za pomocą validates_inclusion_of, jeśli używasz postgres sprawdzeniu https://coderwall.com/p/azi3ka

Powiązane problemy