【问题标题】:Associated has_one and belongs_to models using "where"使用“where”关联 has_one 和 belongs_to 模型
【发布时间】:2016-09-27 10:53:50
【问题描述】:

我希望用户能够关闭项目而不是销毁它们。我想将关闭的原因存储在项目本身的单独表中。我正在尝试通过关联模型来做到这一点。

class Project < ApplicationRecord
  belongs_to :project_status
  has_one :project_close_reason, -> { where 'project_status_id = 10'}
end

class ProjectCloseReason < ApplicationRecord
  belongs_to :projects
end

class ProjectStatus < ApplicationRecord
  has_one :project
end

我只想要用户取消项目时的 ProjectCloseReason(这需要将项目中的 project_status_id 更改为“10”)。但是,当我现在创建一个新项目时,它一直给我一个错误,即项目关闭原因必须存在。有什么想法可以实现吗?上面的{ where... } 在这种情况下似乎不起作用?

更新

澄清我的关联,project_status 模型有一个预定义的状态列表:

(例如:1:待处理,2:分析中,3:工作中,...,10:已取消)。

foreign_key 位于 Project 模型中,因此每个项目都有一个 project_status_id -> 这个 foreign_key 列是我在 Projects 模型关联中的 { where... } 选项中所指的内容。

【问题讨论】:

  • 您是否为项目设置了任何默认项目状态值?我想将默认值设置为 0 可以解决问题
  • 谢谢我添加了一个默认值,但它仍然返回相同的错误
  • project.project_status_id 始终为 0?什么时候创建项目?
  • 我添加了一个默认值,因为每个新产品都有一个默认的project_status_id '1'。最初,我通过手动将 Project#create Action 中的值设置为“1”来完成此操作(这实现了我相信的相同结果)。它有效,但现在意识到这不是处理它的好方法,所以现在修复了,谢谢:)

标签: ruby-on-rails associations models


【解决方案1】:

您需要重新考虑模型之间的关联。你可以试试这个:

project.rb

class Project < ApplicationRecord
  has_one :project_status
  has_one :project_close_reason, through: :project_status
end

project_status.rb

class ProjectStatus < ApplicationRecord
  belongs_to :project
  has_one :project_close_reason, -> { where status: 10 } #assume 'status' is an attribute where you store you project status such as 10
end

project_close_reason.rb

class ProjectCloseReason < ApplicationRecord
  belongs_to :project_status
end

【讨论】:

  • where 'project_status_id = 10' 将返回一个 AR 集合,它看起来不像 has_one ;)
  • @AndreyDeineko 是正确的:) ,需要反转该关联。应将外键添加到提到 belongs_to 关联的模型中,即 ProjectStatus 模型。
  • 谢谢,当您指出这一点时,我意识到我实际上在模型中遇到了另一个问题!我添加了更新并编辑了问题以显示修改后的关联 - 将 belongs_to 更改为 has_one 并没有影响我得到的错误:/还有其他想法吗?
  • 啊,我没看到你的修改,谢谢。目前ProjectStatus 存储预定义的状态列表。而ProjectCloseReason 有一个Comment 字段来捕获此人关闭项目的原因,并且还存储last_project_status 以跟踪它何时被取消。我选择了这个文件结构,以便最终可以编辑ProjectCloseReasons 以使foreign_key 链接到另一个预定义的关闭原因列表。感觉是最稳健的做法?
  • 啊修好了!我有一个错字,并且仍然在方法中保留了 belongs_to 的重复实例。固定的!谢谢 :):) 你原来的解决方案奏效了!
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多