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
在长期使用其他 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