2015-05-01 60 views
0

創建重複條目我有三個表問題標籤,& IssuesLabelhas_and_belongs_to_many模型

issues.rb

class Issue < ActiveRecord::Base 
    has_and_belongs_to_many :labels 
end 

labels.rb

class Label < ActiveRecord::Base 
    has_and_belongs_to_many :issues 
end 

issues_label.rb

class IssuesLabel < ActiveRecord::Base 
    belongs_to :issue 
    belongs_to :label 
end 

當我打電話issue.labels.find_or_create_by(name: 'bug')一個問題, 和issue.labels.find_or_create_by(name: 'bug')了不同的問題,它bug

我會在Labels表兩種不同的記錄期望它找到現有的bug記錄並向IssuesLabel連接表添加條目。我在這裏錯過了什麼?

回答

1

首先,has_and_belongs_to_many與它所連接的派對之間建立了多對多的關係。因此,你可以以這種方式彼此相關的兩個對象:

issues.rb

class Issue < ActiveRecord::Base 
    has_and_belongs_to_many :labels 
end 

labels.rb

class Label < ActiveRecord::Base 
    has_and_belongs_to_many :issues 
end 

請參閱:2.6 has_and_belongs_to_many這個協會:http://guides.rubyonrails.org/association_basics.html

在遷移中,您創建連接表,但不需要對其進行建模。

現在你的創作方式總是會創建一個新的標籤。

有在這兩個報表的差異:

issue.labels.find_or_create_by(name: 'bug') 

issue.labels << Label.find_or_create_by(name: 'bug') 

前者看起來相關標籤裏面的問題,並創建一個,如果它不存在。例如,它只查詢標籤將返回的問題。因此,當它找不到與該名稱相關的問題的相關標籤時,它會創建一個。現在後者的查詢做了不同的處理。它看起來在Labels模型中,並且說:「這裏有沒有標籤'bug'的標籤?」如果有的話,它會找到該標籤並將該問題的標籤關聯起來。如果沒有,它會在將其與問題關聯之前創建一個新標籤。

就你而言,後一種方法將返回你正在尋找的結果。

----從有關刪除-----

has_and_belongs_to關係評論子問題是一個3表連接。當您致電:

issue.labels.first 

您正在列出標籤集合中的第一個對象。這個對象是一個標籤,而不是連接。刪除這個,刪除實際的對象在你的連接表中引用的對象標籤。

issue.labels.first.delete 
issue.labels.first.destroy 

這兩者都是相當於調用,假設有您的收藏中只有一個標籤(包括刪除對象,破壞觸發回調):

Label.first.delete 
Label.first.destroy 

這不是你想什麼實現。什麼,你需要做的就是調用是這樣的:

label = Label.first 
issue.labels.delete(label) 

這使標籤原樣,只是將刪除連接表的關聯。

+0

這是如何去除它們的工作?當我調用'issue.labels.first.delete'時,它會刪除關聯和標籤表中的條目,我只希望它刪除連接表中的關聯。 – theartofbeing

+0

我已經更新了上面的內容,告訴你如何以及爲何如此 – ABrowne

相關問題