У меня есть список хэшей, как таковой:
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
объектов; поэтому я попытался перезаписать hash
eql?
и т. д. в Link
, чтобы игнорировать равенство id
, которое AR::Base
обеспечивает по умолчанию. Но это единственное место, где такое равенство следует учитывать в приложении - в других местах требуется идентификатор по умолчанию Link # id. Есть ли какой-нибудь способ, которым я мог бы создать подкласс Link и применить перезапись hash
, eql?
и т. Д.?
Дерьмовый раствор б):
Другой путь, который я пробовал, - извлечь хеш-атрибуты для каждой ссылки и выполнить .slice('id',...etc)
, чтобы убрать хеш-значения. Но это требует написания отдельных методов -
для отслеживания объектов Link при выполнении операций над множествами над хешами и написания отдельных классов Proxy для переноса хешей и ссылок incoming_links
, что кажется немного излишним. Тем не менее, для меня это текущее решение .
Можете ли вы придумать лучший способ спроектировать это взаимодействие? Дополнительный кредит за чистоту.