我有散列的列表清單,如:比較現場哈希有相當的AR-對象
incoming_links = [
{:title => 'blah1', :url => "http://blah.com/post/1"},
{:title => 'blah2', :url => "http://blah.com/post/2"},
{:title => 'blah3', :url => "http://blah.com/post/3"}]
並已與一些匹配行數據庫字段ActiveRecord模型,說:
Link.all =>
[<Link#2 @title='blah2' @url='...post/2'>,
<Link#3 @title='blah3' @url='...post/3'>,
<Link#4 @title='blah4' @url='...post/4'>]
我想要做的一組操作上Link.all
與incoming_links
,這樣我可以弄清楚,<Link#4 ...>
不在一套incoming_links
,並{:title => 'blah1', :url =>'http://blah.com/post/1'}
不在Link.all
集,像這樣:
#pseudocode
#incoming_links = as above
links = Link.all
expired_links = links - incoming_links
missing_links = incoming_links - links
expired_links.destroy
missing_links.each{|link| Link.create(link)}
蹩腳的解決方案):
我寧願不重寫Array#-
和這樣的,而且我可以接受轉換incoming_links
一組未保存Link
對象;所以我試圖在Link
中覆蓋hash
eql?
等等,以便忽略AR::Base
默認提供的id
相等性。但這是唯一應該在應用程序中考慮這種平等的地方 - 在其他地方,Link#id缺省標識是必需的。有什麼方法可以繼承Link並應用hash
,eql?
等改寫?
蹩腳的解決方案B):
我已經試過另一條路線是拔出來爲每個鏈接的屬性散列並做了.slice('id',...etc)
修剪下來的哈希值。但是這需要編寫獨立的-
方法來跟蹤鏈接對象,同時對哈希進行設置操作,編寫單獨的代理類來包裝incoming_links
哈希和鏈接,這似乎有點矯枉過正。儘管如此,這是我的current solution。
你能想出一個更好的方法來設計這種互動嗎?清潔度額外信貸。
其中一個關鍵點是保持e鏈接周圍的對象,並知道哪些已被排除。要用你的':select'建議來做到這一點,我必須做第二件事 - 寫一個類或方法,在保留Link對象id的同時進行減法。 雖然我只需加載所需的字段是一個有趣的想法,因爲當我需要加速整個過程。 – 2010-05-01 02:14:38
我已經更新了我的答案 – fl00r 2010-05-01 11:41:23