Rails has_one: через присваивания происходит ошибка «неопределенный метод update_attributes» - PullRequest
1 голос
/ 03 декабря 2009

Я не могу понять, почему rails has_one: через ассоциации не принимают назначения. Вот ошибка:

>> u = User.new
=> #<User id: nil, created_at: nil, updated_at: nil>
>> u.primary_account
=> nil
>> u.primary_account = Account.new
NoMethodError: undefined method `update_attributes' for #<Class:0x1035ce5f0>
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1959:in `method_missing'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:380:in `send'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:380:in `method_missing'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2143:in `with_scope'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_proxy.rb:206:in `send'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_proxy.rb:206:in `with_scope'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/association_collection.rb:376:in `method_missing'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations/has_one_through_association.rb:11:in `create_through_record'
    from /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/associations.rb:1274:in `primary_account='
    from (irb):9
>> 

Дано:

class User < ActiveRecord::Base
  has_many :memberships
  has_many :accounts, :through => :memberships
  has_one  :primary_account, :through => :memberships, :source => :account, :conditions => { :role => 1 } # assume memberships.role of type integer in the db
end

class Membership < ActiveRecord::Base
  belongs_to :account
  belongs_to :user
end

class Account < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
end

Кажется, что эти задания должны работать, если я что-то упустил. Похоже, они работают в модульных тестах Rails.

Ответы [ 2 ]

4 голосов
/ 03 декабря 2009

Возможно, вам нужен has_one: primary_membership, а затем используйте учетную запись через него.

has_one :primary_membership, :class_name => 'Membership', :conditions => {:role => 1}

Тогда вы можете,

user.primary_membership.account
0 голосов
/ 03 декабря 2009

Попробуйте установить соответствующую ассоциацию как belongs_to вместо has_one.

Я чувствую, что сталкивался с этим раньше и думаю, что сработало. К сожалению, я не стал вдаваться в подробности, чтобы определить, почему has_one :through имеет или не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...