在这里运行Rails 4。我花了2个小时试图弄明白这一点无济于事。有人请解释我在这里做错了什么吗?
第1步:创建迁移
rails g migration CreateJoinTableCommandContact command contact
第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加入模型
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命令?
答案 0 :(得分:2)
首先,我假设您运行db:migrate
,因为您说:
这导致表名command_contacts(复数)
现在,您的错误显然是在寻找名为command_contacts
的表格(注意命令不是复数)并且无法找到它。因此,我认为问题在于您在模型中定义了关联错误。
尝试将has_many
中的Command
命令更改为:
has_many :commands_contacts
并在Contact
中:
has_many :commands_contacts
答案 1 :(得分:0)
以下是您的选择:
a)将表格commands_contacts
重命名为command_contacts
或
b)将双方的关系重命名为has_many :commands_contacts
,将联接模式重命名为CommandsContact
或
c)我不确定这是否有效,但我记得能够做到这一点。保持当前的数据库设置并以块格式使用has_and_belongs_to_many
。即:
class Contact < ActiveRecord::Base
has_and_belongs_to_many :commands do
def service
where(notification_type: 'service')
end
end
end
# contact.commands.service