has_many / :through rails4

has_many / :through rails4

在长期使用其他 techno 之后,我又回到了 rails,看来我有点生疏了。

我一直在尝试处理项目、客户和联系人,结果让我有点困惑。

起初我的项目中只有一个 "contact_id" 并且所有内容都已找到,但我发现我真的很想为一个项目拥有多个联系人。

这就是我一直在尝试的:

项目模型:

class Project < ActiveRecord::Base
  belongs_to :owner, class_name: User, foreign_key: "owner_id"
  belongs_to :worker, class_name: User, foreign_key: "worker_id"
  #  belongs_to :contact, class_name: Contact, foreign_key: "contact_id"
  has_many :project_contacts
  has_many :contacts, :through => :project_contacts
  has_many :tasks
  has_many :feedbacks
  before_save :set_estimated_time
  #pleinty of utilities
end

联系方式:

class Contact < ActiveRecord::Base
  belongs_to :client, class_name: Client, foreign_key: "client_id"
  has_manny :project_contacts
  has_many :projects, :through => :project_contacts
end

ProjectContact 模型:

class ProjectContact < ActiveRecord::Base
  belongs_to :project
  belongs_to :contact
end

我认为没问题,但这是我使用 Rails 控制台时得到的结果:

2.2.3 :001 > project = Project.find(31) Project Load (0.3ms) SELECT 'projects'.* FROM 'projects' WHERE 'projects'.'id' = 31 LIMIT 1 => # 2.2.3 :002 > project.contacts NameError: uninitialized constant Project::ProjectContact

编辑:

联系人迁移

class AddProjectContacts < ActiveRecord::Migration
  def change
    create_table :project_contacts do |pc|
      pc.belongs_to :project, index: true
      pc.belongs_to :contact, index: true
      pc.timestamps null: false
    end
  end
end

我非常感谢对此的任何帮助

再见

您在 class Contact 中有错别字:has_many 而不是 has_manny

好的,所以我只是将 class 名称更改为 "participant" 来尝试,一切都很好。 :-|

为了后代,我希望它看起来像这样:

#app/models/project.rb
class Project < ActiveRecord::Base
   has_many :project_contacts
   has_many :contacts, through: :project_contacts
end 

#app/models/project_contact.rb
class ProjectContact < ActiveRecord::Base
   #columns id | project_id | contact_id | created_at | updated_at
   belongs_to :project
   belongs_to :contact
end

#app/models/contact.rb
class Contact < ActiveRecord::Base
   has_many :project_contacts
   has_many :projects, through: :project_contacts
end

这应该能让您调用:

@project = Project.find params[:id]
@project.contacts #-> shows all contacts