【发布时间】:2016-04-28 09:43:33
【问题描述】:
我正在构建一个时间跟踪器。您可以创建一个带有开始时间、结束时间、客户和来自该客户的项目的时间戳。这样您就可以看到您为某个项目或客户花费了多少时间。
“has_many”表之间的关系完美无缺,但“has_one”关系存在问题。
我的桌子:
timestamps customers projects
---------- ------------ -----------
id:integer id:integer id:integer
desc:string customer_name:string project_name:string
customer_id:interger project_id:integer
我的模型:
时间戳.rb
class Timestamp < ActiveRecord::Base
has_one :customer
has_one :project, through: :customer
end
客户.rb
class Customer < ActiveRecord::Base
belongs_to :timestamp
has_many :projects, dependent: :destroy
end
项目.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 包含到项目表中,我可以完成这项工作,但是使用这种方法,Rails 在我创建新时间戳时会使用特定的 timestamp_id 复制每个项目。但我想为时间戳分配一个 project_id。
仅供参考:我正在使用带有 MYSQL 数据库的 rails 4.2.6。
【问题讨论】:
-
你的 timestamp.rb 中不应该是
has_many :projects, through: :customer吗?因为一位客户拥有许多项目。如果你故意使用 has_one,那么它只会从列表中获取第一个项目 -
你是对的。但这并不能解决问题。不过谢谢!
-
您的应用程序中的
Timestamp是什么,它的用途是什么?它与 Active Record 时间戳有何不同?我之所以问,是因为这闻起来像 XY 问题,而且你被困在将功能失调的解决方案转换为功能代码的过程中。也许有更好的方法。 -
@sebastian 你想实现多对多关系,比如项目有很多客户,客户有很多项目吗?如果不是,则使用简单的关系而不通过约定。
-
@Substantial 我正在构建一个时间跟踪器。您可以创建一个带有开始时间、结束时间、客户和来自该客户的项目的时间戳。这样您就可以看到您为一个项目或客户花费了多少时间。
标签: mysql ruby-on-rails ruby-on-rails-4 table-relationships