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
我的目标:
- 使用关联的客户和项目创建一个时间戳:
Timestamp.create({desc: "Something", customer_id: "1", project_id: "6"})
- 从时间戳获取项目:
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 来到这里寻找类似问题答案的人:
开始在黑板或纸上绘制表格和列。让关系可视化!这帮助我找出了正确的关系。
我正在构建一个时间跟踪器。您可以使用开始时间、结束时间、客户和该客户的项目创建时间戳。这样您就可以看到您为某个项目或客户花费了多少时间。
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
我的目标:
- 使用关联的客户和项目创建一个时间戳:
Timestamp.create({desc: "Something", customer_id: "1", project_id: "6"})
- 从时间戳获取项目:
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 来到这里寻找类似问题答案的人:
开始在黑板或纸上绘制表格和列。让关系可视化!这帮助我找出了正确的关系。