gpt4 book ai didi

activerecord - 如何在 rails 3 中自动构建关联的多态事件记录对象

转载 作者:行者123 更新时间:2023-12-04 04:51:55 25 4
gpt4 key购买 nike

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

我想做的是打电话:
a = RandomProduct.find(1)
a.item_source

如果 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

最佳答案

在 Rails 3 中,alias_method_chain (和 alias_methodalias )工作正常:

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作为替代方案,它在 profile_attributes 时调用 build设置。与 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 工作并通常保存查询。)

关于activerecord - 如何在 rails 3 中自动构建关联的多态事件记录对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3802179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com