【问题标题】:has_many / :through rails4has_many / :through rails4
【发布时间】:2016-01-20 11:51:23
【问题描述】:

在长时间使用其他 techno 之后,我又回到了正轨,看来我有点生疏了。

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

起初我的项目中只有一个“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.find(31) 项目负载 (0.3ms) SELECT 'projects'.* FROM 'projects' WHERE 'projects'.'id' = 31 LIMIT 1 => # 2.2.3 :002 > project.contacts NameError: 未初始化的常量 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

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

再见

【问题讨论】:

  • 您是否运行了迁移? (我知道愚蠢的问题,但你永远不知道)。另外, projet.project_contacts 返回什么?此关联必须在您运行 project.contacts 之前起作用。同样对于这种关联,如果您不需要在 ProjectContact 模型中做一些特殊的事情,您应该使用 has_and_belongs_to_many:guides.rubyonrails.org/…
  • 是的,我确实运行了迁移(我还手动插入了 1 行以记录)。 project.project_contacts 返回“未定义的方法”
  • 我应该添加一个foreign_key,例如:add_foreign_key :projectcontacts, :projects, column: :project_id, on_delete: :nullify 用于项目和联系人吗?
  • 不,我不认为你必须这样做......嗯......让我测试你的代码:)
  • 谢谢你:-)。真的很难靠自己重回正轨=]

标签: ruby-on-rails ruby-on-rails-4 model-view-controller has-many-through


【解决方案1】:

对于后代,这是我期望的样子:

#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

【讨论】:

  • 好吧,我不确定是否要在表名上复数项目。感谢更新:-)
  • 表名是复数,型号是单数!
  • 是的,我知道,我只是不确定“子词”。我想在这张桌子上期待复数是合乎逻辑的。
【解决方案2】:

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

【讨论】:

  • 好吧,我想如果你有一个不错的 IDE 可以提供建议,那就太好了(但它不能解决我的问题)
  • 你能发布你的迁移吗?
  • @gaetan 试试名为 RubyMine 的 IDE ;)
  • 当你在控制台输入ProjectContact.all时,你有什么?
【解决方案3】:

好的,所以我只是将班级名称更改为“参与者”来尝试,一切都很好。 :-|

【讨论】:

  • 根据rails约定,原始表应该是projects_contacts(这是has_and_belongs_to_many关联所期望的)。但是,当您将“通过”关联与正确配置的表名一起使用时……很奇怪,它一开始就不起作用。正如我所说,我用这些确切的名称对其进行了测试,它对我有用……真的很奇怪,它不适合你。
  • 你能发布你的新模型吗?
  • 密钥是Project::ProjectContact
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 2014-09-01
  • 2011-07-24
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多