Вы можете реорганизовать свой код следующим образом:
Класс домена
class Domain < ActiveRecord::Base
has_many :links
end
Класс ссылки
class Link < ActiveRecord::Base
belongs_to :domain
validates :href,
:uniqueness => true
attr :domain_url
def domain_url=(main_domain_url)
self.domain = Domain.where(domain: main_domain_url).first ||
Domain.new(domain: main_domain_url)
end
def domain_url
self.domain.nil? ? '' : self.domain.domain_url
end
end
Использование
Link.create(href: 'example.com/somepage',
text: 'Some Page',
domain_url: 'example.com')
Заключение
В обоих случаях (ваш и мой) вы получаете два запроса (примерно так):
Domain Load (1.0ms) SELECT "domains".* FROM "domains" WHERE "domains"."domain" = 'example.com' LIMIT 1
AREL (0.1ms) INSERT INTO "links" ("href", "text", "domain_id", "created_at", "updated_at") VALUES ('example.com/somepage', 'Some Page', 5, '2011-04-26 08:51:20.373523', '2011-04-26 08:51:20.373523')
Но с помощью этого кода вы также защищены от неизвестных доменов, поэтому Link
создаст его автоматически.
Также вы можете использовать проверяет уникальность, чтобы вы могли удалить все unless Link.exists?(:href => '...')
.