1

我在模型「片段」和「標籤」之間有HABTM關係。目前,當我用一些標籤保存一個片段時,每個標籤都被保存爲一條新記錄。Rails HABTM fields_for - 檢查是否存在同名記錄

現在我想檢查一個同名的標籤是否已經存在,如果是這樣的話,我不想要一個新的記錄,只有snippets_tags中的一個條目到現有的記錄。

我該怎麼做?

snippet.rb:

class Snippet < ActiveRecord::Base 
    accepts_nested_attributes_for :tags, :allow_destroy => true, :reject_if => lambda { |a| a.values.all?(&:blank?) } 
    ... 
end 

_snippet.html.erb:

<% f.fields_for :tags do |tag_form| %> 
    <span class="fields"> 
    <%= tag_form.text_field :name, :class => 'tag' %> 
    <%= tag_form.hidden_field :_destroy %> 
    </span> 
<% end %> 
+0

我也堅持這一點,期待應該有一個答案,但沒有投票,沒有最愛,也沒有答案(除了作者本人之外)3.5年!? – Quv 2014-04-24 13:04:52

回答

0

好吧,i'm不耐煩......過了一會兒,我發現我工作的解決方案。我不知道這是否是最好的方式,但我想展示它。

我不得不修改Ryan Bates Railscast "Auto-Complete Association"的解決方案,該解決方案處理belongs_to-association以使其與HABTM協同工作。

在我的代碼片段中有一個名爲tag_names的新文本字段,它需要用逗號分隔的標籤列表。

和瑞恩一樣,我使用虛擬屬性來獲取和設置標籤。我認爲其餘的是不言自明的,所以這裏是代碼。

查看 「_snippet.html.erb」

<div class="float tags"> 
    <%= f.label :tag_names, "Tags" %> 
    <%= f.text_field :tag_names %> 
</div> 

模型 「snippet.rb」:

def tag_names 
    # Get all related Tags as comma-separated list 
    tag_list = [] 
    tags.each do |tag| 
    tag_list << tag.name 
    end 
    tag_list.join(', ') 
end 

def tag_names=(names) 
    # Delete tag-relations 
    self.tags.delete_all 

    # Split comma-separated list 
    names = names.split(', ') 

    # Run through each tag 
    names.each do |name| 
    tag = Tag.find_by_name(name) 

    if tag 
     # If the tag already exists, create only join-model 
     self.tags << tag 
    else 
     # New tag, save it and create join-model 
     tag = self.tags.new(:name => name) 
     if tag.save 
     self.tags << tag 
     end 
    end 
    end 
end 

這僅僅是基本的代碼,不能很好地測試和需要改進的,但它似乎有效,我很高興有一個解決方案!