Rails "has_one" 关系。将项目分配给客户(时间戳)

Rails "has_one" relation. Assign Project to Customer(Timestamp)

我正在构建一个时间跟踪器。您可以使用开始时间、结束时间、客户和该客户的项目创建时间戳。这样您就可以看到您为某个项目或客户花费了多少时间。

table 与 "has_many" 之间的关系完美无缺,但我对 "has_one" 关系有疑问。

我的tables:

timestamps              customers             projects
----------              ------------          -----------
id:integer              id:integer            id:integer
desc:string             customer_name:string  project_name:string
customer_id:interger    project_id:integer

我的模特:

timestamp.rb

class Timestamp < ActiveRecord::Base
    has_one :customer
    has_one :project, through: :customer
end

customer.rb

class Customer < ActiveRecord::Base
   belongs_to :timestamp
   has_many :projects, dependent: :destroy
end

project.rb

class Project < ActiveRecord::Base
    belongs_to :customer  
end

我的目标:

  1. 使用关联的客户和项目创建一个时间戳:Timestamp.create({desc: "Something", customer_id: "1", project_id: "6"})
  2. 从时间戳获取项目:Timestamp.find(1).customer.project

我的问题:

如果我将 timestamp_id 包含到项目 table 中,我可以完成这项工作,但是使用这种方法,Rails 会在我使用特定 timestamp_id 时复制每个项目'创建一个新的时间戳。但是我想给时间戳分配一个project_id。

仅供参考:我正在使用 rails 4.2.6 和 MYSQL 数据库。

因为您不希望每个时间戳都有重复的项目和重复的客户,所以您只需要为时间戳设置外键。这样一来,您可能希望拥有包含以下列的表格:

Timestamps
  customer_id:integer:index
  project_id:integer:index

Customers

Projects
  customer_id:integer:index

您必须编写 运行 迁移以删除列,并添加列以使其显示在上方。

然后,修改关联:

class Timestamp < ActiveRecord::Base
  belongs_to :customer # change to belongs_to
  has_many :projects, through: :customer # you might not need this anymore because of the line below
  belongs_to :project # add this line
end

class Customer < ActiveRecord::Base
   has_one :timestamp # change to has_one
   has_many :projects, dependent: :destroy
end

class Project < ActiveRecord::Base
  belongs_to :customer
  has_one :timestamp # add this line
end

然后,您现在可以使用以下内容

Timestamp.find(1).customer
Timestamp.find(1).project
Timestamp.find(1).projects # these projects are customer.projects and are not directly associated to the line above, so I don't think you would need to call this

好的,谢谢大家! @Jay-Ar Polisario 你的回答并不完美,但它让我开始思考我的 "has_one / has_many" 关系,正因为如此,在重新思考这些关系数小时后它才奏效。谢谢。

致所有从 Google 来到这里寻找类似问题答案的人:

开始在黑板或纸上绘制表格和列。让关系可视化!这帮助我找出了正确的关系。