0

我有一個稱爲時間表的模型,它有許多TimesheetRows。 TimesheetRow屬於一項工作。Rails:在建築物/保存對象之前檢查是否存在匹配某個條件的關聯?

class Timesheet < ActiveRecord::Base 
    has_many :timesheet_rows, inverse_of: timesheet 
end 
class TimesheetRow < ActiveRecord::Base 
    belongs_to :timesheet, inverse_of: timesheet_rows 
    belongs_to :job 
end 

在建設原木一個時間表對象,我想檢查是否對應於工作timesheet_row已經已經建成或沒有,如下所示。

timesheet = Timesheet.new() 

if timesheet.timesheet_rows.exists?(job_id:n) 
    #Do something 
else 
    timesheet.timesheet_rows.build(job_id:n) 
end 

我已經試過.exists(條件),.find?(:全部條件),.find_by_job_id(N)。凡(條件)等所有的數據庫查詢,因此不會這裏很有用。

我瀏覽了幾個小時,尋找一些神奇的方法,但找不到任何。真的,我只需要循環所有的關聯?

類似的question

由於

+0

爲什麼不在'TimesheetRow'模型的'job_id'上設置唯一性驗證?它適用於你的情況。 – Pavan

+0

驗證檢查會在保存時間表時發生?我只是想構建時間表而不保存。 – Bot

回答

1

使用紅寶石的select方法,然後檢查是否所得到的數組爲空嘗試。

if timesheet.timesheet_rows.select { |tr| tr.job_id == n }.empty? 
    timesheet.timesheet_rows.build(job_id: n) 
else 
    # Do something 
end 

由於@Bot的意見建議,您也可以使用any?而不是selectempty?

if timesheet.timesheet_rows.any? { |tr| tr.job_id == n } 
    # Do something 
else 
    timesheet.timesheet_rows.build(job_id: n) 
end 
+0

謝謝JKen。現在我看到三個選項.any?{},.detect {}。empty ?, .select {}。empty? 。 雖然我喜歡.any?{}。你可以添加到你的答案? – Bot

+0

沒問題,我很樂意提供幫助。用'any?'打電話,我把它添加到我的答案中。 –

相關問題