What have you found for these years?

2008-09-09

acts_as_taggable_on_steroids 似乎不夠用

updated

棍,怪不得 blogger 沒有改 tag 名的介面?

*

雖然有點想再把站台關閉... anyway, 工作筆記還是要做...

*

翻來翻去發覺,現在需要的 tagging 機制十分複雜,
acts_as_taggable_on_steroids 似乎無法支援這麼複雜的操作。

狀況是這樣,每個 tag name 都是 unique,
所以要貼新的 tag 時,先搜尋是否已存在同名 tag, 以便重複利用。

這樣做的理由我猜大概是希望能做全站 tag 搜尋吧。

不過這也使得 tag 改名變得困難,因為不可能讓 user 改到別人的 tagging.
於是變得需要從 tagging 著手,把所有 tagging 的 tag_id 改為新 tag_id.

但是這邊碰到的問題是,無從判斷該 tagging 是屬於哪個 user 的?
目前的 workaround 變成讓 user 也成為 acts_as_taggable,
所以如果 user 有該 tag 的話,我們也能在 tagging 中找到一個對應 user 的 tagging.

因此,需要多轉很多圈。可能會變成這樣吧:

tag = Tag.find params[:id]
owner_id = tag.taggings.first(:conditions =>
['taggable_type = ? AND taggable_id = ?', 'User', @visitor.id]).
taggable_id

# 因為 rails 吃掉 find method, 這是 workaround
taggings = tag.taggings.to_a

# 到這邊有 3 個 query, 同時需要取出所有的 taggings, 可能有數十萬筆

# 找到所有屬於 owner 的 tagging
# 這邊有 n 個 query, n 是 taggings 數(可能有數十萬筆)
target_taggings = taggings.find{ |tagging|
tagging.taggable.user_id == owner_id
}

new_tag = Tag.create(:name => params[value])

# 這邊可能要存入數百筆
target_taggings.each{ |tagging|
tagging.tag_id = new_tag.id
tagging.save
}


這改名字成本也未免太高了些...
總歸似乎就是因為 acts_as_taggable_on_steroids 沒有 ownership 的概念。

要解決這個問題可能在 tagging 裡面加上 belongs_to :user ?
然後 user 需要 acts_as_taggable 嗎?

或是捨棄全站搜尋所有相同的 tag, 或這部份額外拉出來作成 full text search?
這樣就可以直接對 tag 進行改名的動作,不會影響到其他人。

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0