2015-01-20 3 views
0

Запуск Rails 4 здесь. Я просто потратил 2 часа, пытаясь понять это безрезультатно. Кто-нибудь, пожалуйста, объясните, что я здесь делаю неправильно?Rais 4:: has_many,: сквозные и имена таблиц

Шаг 1: Создание миграции

rails g migration CreateJoinTableCommandContact command contact 

Ste 2: Изменение миграции, чтобы добавить дополнительный notification_type столбец.

class CreateJoinTableCommandContact < ActiveRecord::Migration 
    def change 
    create_join_table :commands, :contacts, :id => false do |t| 
     t.index [:contact_id, :command_id] 
     t.string "notification_type", :null => false 
    end 
    end 
end 

Это приводит имена таблиц commands_contacts (как множественное число)

Шаг 3: Создание модели

command.rb

class Command < ActiveRecord::Base 

    has_many :command_contacts 
    has_many :contacts, :through => :command_contacts 

end 

contact.rb

class Contact < ActiveRecord::Base 

    has_many :command_contacts 

    has_many :host_commands, -> { where notification_type: 'host' }, class_name: 'CommandContact' 
    has_many :host_notification_commands, :through => :host_commands, class_name: 'Command', :source => :command 

    has_many :service_commands, -> { where notification_type: 'service' }, class_name: 'CommandContact' 
    has_many :service_notification_commands, :through => :service_commands, class_name: 'Command', :source => :command 

end 

commands_contacts.rb join model

class CommandContact < ActiveRecord::Base 

    belongs_to :command 
    belongs_to :contact 

end 

Шаг 4: Проверьте его.

irb(main):001:0> Contact.first.host_notification_commands 

Какие результаты в следующих ошибок

Contact Load (0.2ms) SELECT `contacts`.* FROM `contacts` ORDER BY `contacts`.`id` ASC LIMIT 1 
Mysql2::Error: Table 'ngconf_development.command_contacts' doesn't exist: SHOW FULL FIELDS FROM `command_contacts` 
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'ngconf_development.command_contacts' doesn't exist: SHOW FULL FIELDS FROM `command_contacts` 

Я попытался, используя все мыслимые комбинации команды (ами) и контакта (ов) в моей миграции и модели, но до сих пор не могут получить эту Работа. Что я здесь делаю неправильно?

Почему он пытается использовать command_contacts с командой в единственной форме?

+1

Любая причина, по которой вы не используете 'has_and_belongs_to_many'? :) – Hesham

+0

@ H-man: Да, сэр. Мне нужно иметь дополнительный атрибут ': notification_type' в таблице join_contacts join, и это невозможно с' has_and_belongs_to_many' – solefald

ответ

1

Прежде всего, я предполагаю, что вы запускали db:migrate, так как вы говорите:

Это приводит имена таблиц commands_contacts (как множественное число)

Теперь ваша ошибка четко сказать, что это ищет таблицу с именем command_contacts (обратите внимание, что команда не множественное число) и не может ее найти. Поэтому я предполагаю, что проблема заключается в том, что вы неправильно определили ассоциацию внутри своих моделей.

Попробуйте изменить команду has_many в Command для:

has_many :commands_contacts

и Contact к:

has_many :commands_contacts

+0

Aaaand вы решили его. Я на самом деле trie все множественное число прежде, кроме фактического имени класса модели соединения! Спасибо! – solefald

0

Вот варианты:

а) Переименовать таблицу commands_contacts до command_contacts, или

б) Переименуйте отношение с обеих сторон к has_many :commands_contacts и присоединиться к модели CommandsContact или

с) я не уверен, если это будет работать, но я помню, что в состоянии сделать это. Сохраните текущую настройку db и используйте has_and_belongs_to_many в формате блока. i.e:

class Contact < ActiveRecord::Base 
    has_and_belongs_to_many :commands do 
    def service 
     where(notification_type: 'service') 
    end 
    end 
end 
# contact.commands.service 
Смежные вопросы