1

Я получаю сообщение об ошибке:Невозможно записать неизвестный атрибут для has_many через источник с другим has_many к тому же таблице

ActiveModel::MissingAttributeError: can't write unknown attribute `[:account_id, :list_id]` 

Модель:

class Account < ActiveRecord::Base 
    has_many :accounts_lists 
    has_many :subscriptions, -> {uniq}, :through => :accounts_lists, source: :list 
    has_many :lists, foreign_key: 'creator_id' 
end 

class List < ActiveRecord::Base 
    has_many :accounts_lists 
    has_many :subscribers, -> {uniq}, :through => :accounts_lists, source: :account 
    belongs_to :creator, class_name: 'Account' 
end 

class AccountsList < ActiveRecord::Base 
    self.primary_key = [:account_id, :list_id] 
    belongs_to :account 
    belongs_to :list 
end 

Я пытаюсь запустить метод семян и добавить список к учетной записи в следующих командах:

a = Account.create(email: 'email', password: 'secret', password_confirmation: 'secret') 
list1 = List.create(creator: a, list_type: music, name: "a's list 1") 
a.subscriptions << list1 

Я изменил название типичного account.lists для соединения «многие-ко-многим» из-за природы приложения. У учетной записи может быть множество списков, на которые она подписана, а также множество списков, которые она создала.

Я считаю, что от того, как будет сформулирована ошибка, то возникли проблемы с поиском правильного объединения, чтобы использовать для добавления List на subscriptions коллекции Account.

Любые идеи?

ответ

1

Итак, после прочтения всей документации, и, глядя на моих потребностях и параметрах конфигурации в has_many :through и has_and_belongs_to_many, я понял, что я на самом деле не нужно has_many :through из-за характер объединений, а с has_and_belongs_to_many (habtm for short) имеет все варианты настройки, которые мне нужно было определить точно, что мне нужно, чтобы присоединиться. Я решил попробовать этот вариант. Ниже приведен рабочий код для любых будущих googlers, которые имеют такую ​​же проблему.

class Account < ActiveRecord::Base 
    has_and_belongs_to_many :subscriptions, -> {uniq}, class_name: 'List', join_table: 'accounts_lists', foreign_key: 'subscription_id', association_foreign_key: 'subscriber_id' 
    has_many :lists, foreign_key: 'creator_id' 
end 

class List < ActiveRecord::Base 
    has_and_belongs_to_many :subscribers, -> {uniq}, class_name: 'Account', join_table: 'accounts_lists', foreign_key: 'subscriber_id', association_foreign_key: 'subscription_id' 
    belongs_to :creator, class_name: 'Account', foreign_key: 'creator_id' 
end 

И только отметить еще один интересный присоединиться к сценарию у меня было следующее:

class List < ActiveRecord::Base 
    has_and_belongs_to_many :parents, -> {uniq}, class_name: 'List', join_table: 'lists_lists', foreign_key: 'parent_id', association_foreign_key: 'child_id' 
    has_and_belongs_to_many :children, -> {uniq}, class_name: 'List', join_table: 'lists_lists', foreign_key: 'child_id', association_foreign_key: 'parent_id' 
end 

Это многие-ко-многим, где в основном List может иметь Lists, которые в свою очередь могут иметь Lists который может иметь больше Lists и т. д. и т. д. и т. д.

Надеюсь, что это поможет другим с этой проблемой в будущем ... хотя .... Если кто-нибудь знает, как это сделать с помощью has_many :through Мне все равно хотелось бы знать, возможно ли это, используя этот тип соединения.

Смежные вопросы