Rails3 has_and_belongs_to_many - ошибка при получении атрибута из таблицы соединений - PullRequest
1 голос
/ 20 сентября 2011

Учитывая, что у меня следующая структура:

class A < ActiveRecord::Base
  has_and_belongs_to_many :bs, :class_name => "B", :join_table => "ab"
end

class AB < ActiveRecord::Base
  #ab has a date column "creation_date"
  #ab also has a text column "creatior"
end

class B < ActiveRecord::Base
end

Я успешно получил атрибут "creation_date" в rails console

console> A.find(1).bs.first.creation_date
        => "14/08/1874"

В контроллере

@a = A.find(1)
@bs = a.bs

Но используя его в виде (частично), я получил следующую ошибку

bs.each do |b|
  b.b_attribute #this is O.K.
  b.creation_date # cause error =>    undefined method `creation_date` for #<B:...>
end

 # also try to debug in partial
 A.find(1).bs.first.creation_date #=> this return data correctly

Проблема, как показано выше, что может вызвать undefined method, пока прямые атрибуты все еще доступны.

Кто-нибудь знает, что не так с моим кодом?

1 Ответ

2 голосов
/ 20 сентября 2011

Когда вы имеете дело с промежуточной моделью, вы не должны использовать has_and_belongs_to_many.Этот метод работает только в том случае, если таблица объединения является , а не моделью.Вам необходимо провести четкое различие между понятиями модель и таблица .В рельсах вы редко имеете доступ к базовой таблице, чаще всего вы имеете дело с моделями оберток.

Если в вашей таблице соединений есть что-то большее, чем внешние ключи для A и B, и вам нужночтобы получить доступ к этим дополнительным данным, тогда это должна быть модель.В вашем случае это так, но вы не используете правильное отношение.Он должен выглядеть следующим образом:

class A < ActiveRecord::Base
  has_many :abs
  has_many :bs, :through => :abs
end

class AB < ActiveRecord::Base
end

class B < ActiveRecord::Base
end

После этого доступ к creation_date и creator должен осуществляться через модель AB, поскольку это действительно атрибут, который ему принадлежит.

Посмотрите здесь быстрое объяснение с примерами: http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

...