Ruby on rails 覆盖';全部';rubyonrails中的一种模型方法
我有一个Ruby on rails 覆盖';全部';rubyonrails中的一种模型方法,ruby-on-rails,Ruby On Rails,我有一个帐户模型,该模型具有以下列: id :bigint(8) name :string 在app/models/account.rb中,我有: class Account < ApplicationRecord has_one_attached :logo end 上面的代码返回: [ { "id": 1, "name": "Example1" }, { "id": 2, "name": "Example2" } ] 我还想包括
帐户
模型,该模型具有以下列:
id :bigint(8)
name :string
在app/models/account.rb
中,我有:
class Account < ApplicationRecord
has_one_attached :logo
end
上面的代码返回:
[
{
"id": 1,
"name": "Example1"
},
{
"id": 2,
"name": "Example2"
}
]
我还想包括附加到返回的JSON的ActiveStorage
文件的url
为了实现这一点,我在控制器中执行以下操作:
def index
@accounts =
Account.all.map do |account|
account =
account.attributes.merge(
:logo_url =>
account.logo.attached? ?
polymorphic_url(account.logo) : nil
)
end
render :json => @accounts
end
这将返回:
[
{
"id": 1,
"name": "Example1",
"logo_url": "/path/to/logo.jpg"
},
{
"id": 2,
"name": "Example2",
"logo_url": "/path/to/logo.jpg"
}
]
但是,我不想在每次调用帐户时都这样做;每当调用帐户时,我想自动添加徽标\u url
。all
我已经想出了这个解决办法;我决定重写模型中的方法,而不是在控制器中调用它。在app/models/account.rb
中,我添加了:
def self.all
super.map do |account|
account =
account.attributes.merge(
:logo_url =>
account.logo.attached? ?
polymorphic_url(account.logo) : nil
)
end
end
上面的代码工作得很好。问题在于方法find
,find\u by
,where
,以及其他方法停止工作。如果我从account.rb
中删除self.all
方法,它会再次工作
以下代码:
Account.find_by :id => params[:id]
Account.find params[:id]
引发错误:
undefined method `where' for #<Array:0x00007fd09b68d670>
的未定义方法“where”#
我相信这是因为self.all
返回一个数组而不是活动记录
如何覆盖模型中的
all
方法?我认为您不想覆盖Account.all
。
相反,您希望更改模型的默认序列化。
试试这个:
class Account < ApplicationRecord
has_one_attached :logo
private
def serializable_hash(options)
super(options).merge("logo_url" => logo_url)
end
def logo_url
logo.attached? ? polymorphic_url(account.logo) : nil
end
end
类帐户logo\u url)
结束
def logo_url
logo.attached?多态url(account.logo):无
结束
结束
控制器最终在您的模型上调用
到_json
,并最终使用#serializable_hash
。由于to_-son
使用选项设置json的根,所以最好覆盖serializable_-hash
。另一种方法是为每个模型创建一个单独的序列化器类,但这应该适用于一个简单的情况。您能说明如何在控制器中实现它吗?我相信它会在控制器中工作,因为控制器会尝试序列化模型并调用来调用json
,从而调用新代码。
class Account < ApplicationRecord
has_one_attached :logo
private
def serializable_hash(options)
super(options).merge("logo_url" => logo_url)
end
def logo_url
logo.attached? ? polymorphic_url(account.logo) : nil
end
end