2012-04-19 97 views
0

我有一個課程表和一個標記表。通過關係,我的中間表是tags_relationship.rb使用has_many的rails模型關聯:通過

class Lesson < ActiveRecord::Base 
    attr_accessible :title, :desc, :content, :tag_name 
    belongs_to :user 

    has_many :tag_relationships 
    has_many :tags, :through => :tag_relationships 
end 

class Tag < ActiveRecord::Base 
    attr_accessible :name 

    has_many :tag_relationships 
    has_many :lessons, :through => :tag_relationships 
end 

在我的意見之一,我嘗試創建一個虛擬屬性:我可以將兩個使用的has_many了他們。我有...

<div class="tags"> 
     <%= f.label :tag_name, "Tags" %> 
     <%= f.text_field :tag_name, data: { autocomplete_source: tags_path} %> 
    </div> 

,但我的經驗教訓表中沒有該屬性,TAG_NAME,所以叫我的方法,而不是

def tag_name 
     ???????? 
    end 

    def tag_name=(name) 
     self.tag = Tag.find_or_initialize_by_name(name) if name.present? 
    end 

但林不知道里面的放什麼??? ?????。即時嘗試引用:我的標籤表中的名稱屬性。

那時我用了一個has_many和belongs_to的關係。我的課屬於一個標籤(這是錯誤的),但我能寫...

tag.name 

它的工作。但自從它has_many:通過現在,我不知道。我嘗試使用tags.name,Lessons.tags.name等,但我似乎無法讓它工作。我如何參考標籤表名稱屬性?謝謝

+1

由於您有多對多的關係,因此您似乎需要決定名稱應該是「lesson」的所有'tags'中的哪一個。 – 2012-04-19 21:03:17

+0

即時通訊抱歉,但你能澄清?即時通訊不能確定你的意思是什麼 – Sasha 2012-04-19 21:06:11

回答

2

道歉爲我的英語不好。

當你的Lesson屬於Tag課程只有一個tag,所以你的代碼是正確的。但現在Lesson有很多Tag s,它是集合(簡單的數組)。所以,你必須制定者更加複雜:

def tag_names=(names) 
    names = if names.kind_of? String 
    names.split(',').map{|name| name.strip!; name.length > 0 ? name : nil}.compact 
    else 
    names 
    end 

    current_names = self.tags.map(&:name) # names of current tags 
    not_added = names - current_names # names of new tags 
    for_remove = current_names - names # names of tags that well be removed 

    # remove tags 
    self.tags.delete(self.tags.where(:name => for_remove)) 
    # adding new 
    not_added.each do |name| 
    self.tags << Tag.where(:name => name).first || Tag.new(:name => name) 
    end 
end 

和getter方法應該是這樣的:

def tag_names 
    self.tags.map(&:name) 
end 

順便說一句,像find_by_name發現者已被棄用。您必須使用where

+0

感謝您的答覆。嗯,我的吸氣劑呢?它仍然拋出一個錯誤,我把??????放在哪裏。 – Sasha 2012-04-19 21:29:24

+0

我會認爲tags.try(:名稱)會工作,但我猜不是 – Sasha 2012-04-19 21:30:11

+1

剛剛更新了我的答案。 'tags'不是一個簡單的對象。它是一個對象集合。所以它沒有'name'方法。但是這個metod有所有它的元素 – 2012-04-19 21:34:11

相關問題