2016-09-27 112 views
0

我希望用户能够关闭项目而不是销毁它们。我想将紧密的原因存储在项目本身的单独表格中。我正在尝试通过关联的模型来完成此操作。使用“where”关联has_one和belongs_to模型

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... }在这种情况下似乎不起作用?

UPDATE

澄清我的协会,project_status模型状态的预定义列表:

(如:1:待定,2:分析,3:工作,...,10:取消)。

foreign_key坐在项目模型中,以便每个项目都有一个project_status_id - >这个foreign_key列是我在项目模型关联中的{ where... }选项中提到的。

+0

你是否为项目设置了默认的项目状态值?我猜设置默认值为0将解决问题 –

+0

谢谢我已经添加了一个默认值,但它仍然返回相同的错误 – Stephen

+0

project.project_status_id总是0?当你创建一个项目? –

回答

0

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

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 
+0

'where'project_status_id = 10''将返回一个AR集合,它看起来不像has_one;) –

+0

@AndreyDeineko是的正确的:),需要扭转这种关联。应将外键添加到提到'belongs_to'关联的模型中,即'ProjectStatus'模型。 – dp7

+0

谢谢,我意识到,当你指出这一点时,模型中实际上还有另一个问题!我添加了更新并编辑了问题以显示修改后的关联 - 将belongs_to更改为has_one并未影响我收到的错误:/还有其他想法? – Stephen

相关问题