0

我期待設置一個用戶可以創建帖子並標記該帖子的關係。該帖子和那些標籤屬於該用戶。我的關聯有什麼問題?

我一直在試圖調試這最後三天。我不知道爲什麼當我保存我的帖子時,user_id沒有填充到標籤模型中。我將user_id添加到Tag模型中。

對於過多的代碼,我提前道歉。

User - has_many posts; has_many標籤

後 - belongs_to用戶; has_many標籤; has_many標籤通過標籤

標籤 - 有很多標籤; has_many通過標籤發帖; belongs_to用戶

Tagging - belongs_to post; belongs_to的標籤

ActiveRecord::Schema.define(:version => 20121031012555) do 

    create_table "posts", :force => true do |t| 
    t.integer "user_id" 
    t.string "summary" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "taggings", :force => true do |t| 
    t.integer "post_id" 
    t.integer "tag_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    add_index "taggings", ["post_id"], :name => "index_taggings_on_post_id" 
    add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" 

    create_table "tags", :force => true do |t| 
    t.string "name" 
    t.integer "user_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "users", :force => true do |t| 
    t.string "username" 
    t.string "email" 
    t.string "crypted_password" 
    t.string "password_salt" 
    t.string "persistence_token" 
    t.datetime "created_at",  :null => false 
    t.datetime "updated_at",  :null => false 
    t.string "role" 
    end 

end 

在樁模型:

def tag_ids=(tags_string) 
    self.taggings.destroy_all 

    tag_names = tags_string.split(",").collect{|s| s.strip.downcase}.uniq 
    tag_names.each do |tag_name| 
     tag = Tag.find_or_create_by_name(tag_name) 
     tagging = self.taggings.new 
     tagging.tag_id = tag.id 
    end 
end 
+0

你可以使用'對於has_and_belongs_to_many'關係。這可以幫助你避免這種虛假摧毀。 – ck3g

+0

您在分配'tagging.tag_id = tag.id'後不保存'taggings'。我沒有看到你想要保存的地方'user_id' – ck3g

+0

@ ck3g這是他爲此所做的要點:https://gist.github.com/4025471 –

回答

1

我道歉,如果我失去了一些東西,但它看起來像你不通過用戶ID標籤它被創建的時候。隨着軌道3,你可以做你的find_or_create_by不止一個屬性,像這樣:

tag = Tag.find_or_create_by_name_and_user_id(tag_name, user_id) 

此外,如果你只是想建立標籤對象,但不會立即將其保存到數據庫,你可以使用「find_or_initialize_by ......」的方法,像這樣:

tag = Tag.find_or_initialize_by_name_and_user(tag_name, user) 

只要確保你的標籤模型attr_accessible :user_id如果沒有了。

更新:對不起,我只是重新讀你的問題,你說你確實將user_id傳遞給標記模型。但是我在你提供的代碼中沒有看到這一點。發生在哪裏?

更新#2 根據評論線程,您的參數映射不包含user_id;這當然是因爲參數映射是從表單輸入構建的,這些輸入顯然不包含用戶的輸入。

我打算假設創建一個帖子時,它應該與當前登錄的用戶相關聯。我還會假設你有某個地方提供了一個對當前登錄用戶的引用,我將把它稱爲@current_user。

因爲它看起來像你想創建一個原子操作崗位和相關標籤,有一兩件事你可以做的當前用戶添加到參數映射的副本,就像這樣:

post_params = params.clone.store(:user=>@current_user) 
@post = Post.new(post_params) 

有這可能是一個更好的方法,但這應該起作用。請注意,您可能不需要對參數映射進行克隆;我管理員我不確定在這種情況下最佳做法是什麼。

無論如何,希望有所幫助。

更新3 由於Ruby的哈希值在其中鍵插入的順序遍歷,SVN的tag_ids是在設置之前他向早報模型USER_ID。爲了解決這個問題,svn顛倒了我之前建議的順序,並確保在任何其他值之前插入:user鍵。這是一個可能的解決方案(從SVN的要點(https://gist.github.com/4027807)修改):

post_params = {:user => current_user}.merge!(params[:post].clone) 
@post = Post.new(post_params) 
+0

所以我的tag_ids是存儲在模型中的虛擬屬性。我已經嘗試了find_or_create_by_name_and_user_id,但是我無法獲得Post模型中的user_id信息(其中存儲了tag_ids)。我的標記模型確實有attr_accessible:user_id。我仍然不確定自己在做什麼錯誤或如何做到這一點。 – ebbflowgo

+0

@svn好的,我沒有得到這個tag_ids在Post模型中。所以,如果Post模型有一個用戶關聯,你怎麼不能讓用戶使用像'tag.user = self.user'這樣的東西('self'是當前的Post實例)?那有意義嗎?對不起,如果我仍然失去了一些東西。 –

+0

這正是我的想法!當我調試時,self.user是零。在Post控制器中,當原始@post = Post.new(params [:post])被實例化時,它通過tag_ids =方法運行,此時self.user爲零。我一直在閱讀,但是我無法找到這是否應該是這種情況,如果不是我可能會出錯的地方。我已經把代碼放在了一個要點中https://gist.github.com/4025471 – ebbflowgo

0

在控制器中前行,

@post = Post.new(params[:post]) 

添加以下行

@post = Post.new(:user_id => <assign your required user_id>) 

這將使新的post對象在其instace方法內使用user_id。
然後你就可以使用,下面一行成功

tag = Tag.find_or_create_by_name_and_user_id(tag_name, user_id) 

希望它能幫助:)

+0

對不起,我不太明白你在這裏說什麼。在哪一行? – ebbflowgo

+0

在您的創建方法中,在行「@post = Post.new(params [:post])」之前,您應該添加給定的行,以指定您的帖子屬於特定用戶 – Prem