gpt4 book ai didi

ruby-on-rails - Ruby(Rails)将属性委托(delegate)给另一个模型的方法?

转载 作者:行者123 更新时间:2023-12-04 20:07:58 24 4
gpt4 key购买 nike

-编辑-

从第一个答案中阅读了 Delegate 方法后,我的问题是,是否可以将两种不同的方法委托(delegate)给另一种方法。

IE:我目前有:@photo.attachment.file.url、@photo.attachment.height 和@photo.attachment.width

我希望能够通过@photo.file.url、@photo.file.height、@photo.file.width 访问所有这些。

语法的原因是 Attachment 是一个使用 Paperclip 管理文件的模型,Paperclip 正在生成 .file 方法(模型称为 Attachment,模型使用 Paperclip 的 has_attached_file :file )。

-原始问题-

我想知道 Ruby 中的别名方法和属性(我认为这是一个通用的 ruby​​ 问题,尽管我的应用程序在 Rails 3 中):

我有两个模型: 照片 has_one 附件。

附件具有“高度”和“宽度”属性,以及"file"方法(来自 Paperclip)。

所以默认情况下我可以像这样访问附件模型的位:

photo.attachment.width # returns width in px
photo.attachment.height # returns height in px
photo.attachment.file # returns file path
photo.attachment.file.url #returns url for the default style variant of the image
photo.attachment.file.url(:style) #returns the url for a given style variant of the image

现在,在我的照片类中,我创建了这个方法:
def file(*args)
attachment.file(*args)
end

所以,现在我可以简单地使用:
photo.file # returns file path
photo.file.url # returns file url (or variant url if you pass a style symbol)

我的问题是,我可以直接 photo.attachment.file只需 photo.file , 但我也可以将高度和宽度映射到 photo.file , 因此,为了保持一致性,我可以通过 photo.file.height 访问高度和宽度属性和 photo.file.width ?

这样的事情有可能吗?如果有,它是什么样子的?

最佳答案

所以你要问的是

photo.file       --> photo.attachment.file
photo.file.url --> photo.attachment.file.url
photo.file.width --> photo.attachment.width

你不能用委托(delegate)来解决这个问题,因为你想要 file根据接下来的内容来表示不同的事物。要实现这一点,您需要重新打开回形针,我不建议这样做(因为我相信 api 本来就很好)。

我能想到解决这个问题的唯一方法是添加消除 file水平也。像这样:
photo.width      --> photo.attachment.width
photo.file --> photo.attachment.file
photo.url --> photo.attachment.file.url

然后你可以使用 delegate 来解决这个问题。对于每个想要的方法。

所以你写
class Photo
delegate :width, :height, :file, :to => :attachment
delegate :url, :to => :'attachment.file'
end

希望这可以帮助。

关于ruby-on-rails - Ruby(Rails)将属性委托(delegate)给另一个模型的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4703357/

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