Pau*_*aul 7 activerecord ruby-on-rails-3
class ItemSource < ActiveRecord::Base
belongs_to :product, :polymorphic => true
end
class RandomProduct < ActiveRecord::Base
has_one :item_source, :as => :product, :autosave => true, :dependent => :destroy
end
Run Code Online (Sandbox Code Playgroud)
我想做的是打电话:
a = RandomProduct.find(1)
a.item_source
Run Code Online (Sandbox Code Playgroud)
如果item_source尚不存在(= nil),则自动构建(build_item_source).
以前,我用alias_chain_method做了这个,但是在Rails 3中不支持.
哦,我也试过这个无济于事:
class RandomProduct < ActiveRecord::Base
has_one :item_source, :as => :product, :autosave => true, :dependent => :destroy
module AutoBuildItemSource
def item_source
super || build_item_source
end
end
include AutoBuildItemSource
end
Run Code Online (Sandbox Code Playgroud)
ste*_*lis 10
在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
Run Code Online (Sandbox Code Playgroud)
但总是accept_nested_attributes_for
作为一种替代方案,在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"...>
Run Code Online (Sandbox Code Playgroud)
如果始终创建关联,则不需要委派(但无论如何都可能有用).
(注:我设置:inverse_of
,使Profile.validates_presence_of :user
工作和一般保存查询.)
归档时间: |
|
查看次数: |
3656 次 |
最近记录: |