gpt4 book ai didi

ruby-on-rails - ActiveRecord 集合和自定义方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:56 31 4
gpt4 key购买 nike

我正在尝试创建一个 factory_build 类方法来在 ActiveRecord 集合中创建 Redirect 对象(见下文)。

例如 @website.redirects.factory_build(:code => 301) 将返回 PermenantRedirect 对象的新实例。但是,即使我能够调用 factory_build 类方法,我也无法访问 @website 的 primary_key。有没有办法从集合内部访问@website.id,或者我是否被迫将它传递给方法调用?任何其他建议也将受到欢迎,也许我不会以正确的方式解决这个问题。谢谢。

class Website < ActiveRecord::Base
has_many :redirects
has_many :permenant_redirects
has_many :temporary_redirects
end

# Redirect is an abstract class it uses Rails Single Table Inheritance
class Redirect < ActiveRecord::Base
def self.factory_build(attributes)
status_code = attributes.delete(:code)
case status_code
when 301
Website.find( ... ).permenant_redirects.new(attributes)
when 302
Website.find( ... ).temporary_redirects.new(attributes)
else
raise InvalidStatusCodeError
end
end
end

class TemporaryRedirect < Redirect
def status
302
end
end

class PermenantRedirect < Redirect
def status
301
end
end

最佳答案

您需要访问此关系的范围,以便能够正确构造这些对象。这可用于类方法:

class Redirect < ActiveRecord::Base
def self.factory_build(attributes)
redirect_type =
case (status_code = attributes.delete(:code))
when 301
PermanentRedirect
when 302
TemporaryRedirect
else
Redirect
end

redirect_type.new(attributes.merge(scoped.scope_for_create))
end
end

我冒昧地干掉了你的创建代码,因为你有很多重复的地方。另请注意,调用 find 只是为了建立关系是一种资源浪费。如果您知道记录的 ID,只需将其作为属性传递,除非您有充分的理由首先检索它。

scoped.scope_for_create 调用返回由您当前的一个或多个范围定义的属性。这些通常采用类似 { 'website_id' => 101 } 的形式,可以传递给您的创建调用。

关于ruby-on-rails - ActiveRecord 集合和自定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4940329/

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