В Rails 3 alias_method_chain
(и alias_method
, и alias
) работают нормально:
class User < ActiveRecord::Base
has_one :profile, :inverse_of => :user
# This works:
#
# def profile_with_build
# profile_without_build || build_profile
# end
# alias_method_chain :profile, :build
#
# But so does this:
alias profile_without_build profile
def profile
profile_without_build || build_profile
end
end
Но в качестве альтернативы всегда есть accept_nested_attributes_for
, который вызывает build, когда profile_attributes
установлены.Объедините его с delegate
(необязательно), и вам не придется беспокоиться, существует ли запись:
class User < ActiveRecord::Base
has_one :profile, :inverse_of => :user
delegate :website, :to => :profile, :allow_nil => true
accepts_nested_attributes_for :profile
end
User.new.profile # => nil
User.new.website # => nil
u = User.new :profile_attributes => { :website => "http://example.com" }
u.profile # => #<Profile id: nil, user_id: nil, website: "http://example.com"...>
Если связь создается всегда, делегирование не требуется (но может быть полезнов любом случае).
(Примечание: я установил :inverse_of
, чтобы заставить Profile.validates_presence_of :user
работать и вообще сохранять запросы.)