Имеет много сквозных отношений с принимает вложенные атрибуты

Я понимаю, что для использования вложенных атрибутов мне нужно использовать отношение «имеет много» вместо отношения «имеет» и принадлежать многим, поэтому у меня есть следующие настройки:

class Deed < ActiveRecord::Base
    has_many :deeds_title_abstracts
    has_many :title_abstracts, through: :deeds_title_abstracts
end

class TitleAbstract < ActiveRecord::Base
    has_many :deeds_title_abstracts
    has_many :deeds, through: :deeds_title_abstracts
    accepts_nested_attributes_for :deeds
end

class DeedsTitleAbstracts < ActiveRecord::Base
  belongs_to :deeds
  belongs_to :title_abstracts
end

В моем контроллере для рефератов заголовков у меня есть

def new
   @title_abstract = TitleAbstract.new(params[:title_abstract])
   @title_abstract.deeds.build
   respond_with(@title_abstract)
end

Я использую кокон в представлении, но я не думаю, что это проблема, так как я получаю эту ошибку:

  uninitialized constant TitleAbstract::DeedsTitleAbstract

Я получаю следующее, когда смотрю на него через консоль

   @title_abstract =TitleAbstract.new(params[:title_abstract])
   => #<TitleAbstract id: nil, name: nil, due_date: nil, comments: nil,     created_at: nil, updated_at: nil>
   >> @title_abstract.deeds.build
   !! #<NameError: uninitialized constant TitleAbstract::DeedsTitleAbstract>

Я думаю, что что-то не так с моими моделями Has Many Through


person tbrooke    schedule 04.03.2015    source источник


Ответы (1)


Ваше имя модели соединения не соответствует соглашению об именах Rails. Он должен называться DeedTitleAbstract вместо DeedsTitleAbstracts. Таким образом, исправить это имя класса, включая имя таблицы базы данных, вероятно, лучше всего вместо включения обходного пути (показанного ниже).

Обходной путь для этого состоит в том, чтобы указать параметр class_name для has_many :deeds_title_abstracts как:

has_many :deeds_title_abstracts, class_name: 'DeedsTitleAbstract'

См. Соглашения об именах.

Кроме того, ваши определения отношений belongs_to нуждаются в пересмотре. Отношения belongs_to должны быть определены в модели, содержащей внешний ключ, и они должны быть в единственном числе, а не во множественном числе.

Вот обновление вашего определения отношений (т.е., конечно, после того, как вы обновили миграцию таблицы соединений, включая изменение имени модели)

class Deed < ActiveRecord::Base
    has_many :deed_title_abstracts
    has_many :title_abstracts, through: :deed_title_abstracts
end

class TitleAbstract < ActiveRecord::Base
    has_many :deed_title_abstracts
    has_many :deeds, through: :deed_title_abstracts
    accepts_nested_attributes_for :deeds
end

class DeedTitleAbstract < ActiveRecord::Base
  belongs_to :deed
  belongs_to :title_abstract
end
person vee    schedule 04.03.2015
comment
спасибо - именно так и было - person tbrooke; 05.03.2015