Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 5.2活动存储添加自定义属性_Ruby On Rails_Ruby_Rails Activestorage - Fatal编程技术网

Ruby on rails Rails 5.2活动存储添加自定义属性

Ruby on rails Rails 5.2活动存储添加自定义属性,ruby-on-rails,ruby,rails-activestorage,Ruby On Rails,Ruby,Rails Activestorage,我有一个带有附件的模型: 类项目

我有一个带有附件的模型:

类项目
附加并保存图像时,我还希望与附加图像一起保存一个附加的自定义属性-
显示顺序
(整数)。我想使用它对附加的图像进行排序,并按照我在此自定义属性中指定的顺序显示它们。我已经查看了
#attach
方法以及
ActiveStorage::Blob
模型的ActiveStorage源代码,但似乎没有内置的方法来传递一些自定义元数据


我想知道,用ActiveStorage解决这个问题的惯用方法是什么?在过去,我通常只向表示我的附件的ActiveRecord模型添加一个
display\u order
属性,然后将其与
.order(display\u order::asc)
查询一起使用。

如果需要为每个图像存储附加数据并基于该数据执行查询,我建议提取一个包装附加
文件的
图像
模型

# app/models/project.rb
class Project < ApplicationRecord
  has_many :images, dependent: :destroy
end
#app/models/project.rb
类项目<应用程序记录
有很多:映像,依赖::销毁
结束
#app/models/image.rb
类映像<应用程序记录
属于:项目
附件:文件
委托\u缺少\u到:文件
作用域:定位,->{order(position::asc)}
结束


请注意,上面的示例视图导致对具有N个图像的项目进行2N+1次查询(一次查询项目的图像,另一次查询每个图像的
ActiveStorage::Attachment
记录,另一次查询每个附加的
ActiveStorage::Blob
)。为了清晰起见,我故意避免优化查询数量。

如果您只需要对图像进行排序,您可以自定义文件名并按文件名对图像进行排序。我使用我极力推荐的羽绒宝石

例如:

image = Down.download(image_url)
filename = "description-#{order}"
@object.images.attach(io: image, filename: filename)
然后在@object的控制器中:

@images = @object.images_attachments.joins(:blob).order('active_storage_blobs.filename ASC')
然后在@object的视图中

<%@images.each do |image|%>
<%= image_tag image%>
<% end %>


使用此解决方案是否有有效的方法使用“with_attached_#{}”宏?@Richard,您可以使用
ActiveRecord::Base#includes
merge
来定义自己的
with_attached_图像范围。这里有一个更完整的例子:非常感谢你的例子,我明天会试试这个!你好,乔治·克拉霍恩。我只是偶然发现了这篇调查类似需求的文章。我已经实现了用户旋转和裁剪功能。为了使其工作,这些值需要保存在数据库中,并由渲染时的活动存储调用。在未来的活动存储版本中,是否可以使用附件保存其他属性?
@images = @object.images_attachments.joins(:blob).order('active_storage_blobs.filename ASC')
<%@images.each do |image|%>
<%= image_tag image%>
<% end %>