Rails 4 :: has_many,:through和表名

时间:2015-01-20 01:57:38

标签: ruby-on-rails

在这里运行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命令?

2 个答案:

答案 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