gpt4 book ai didi

ruby-on-rails - 在 Rails 中使用带有 has_many 的委托(delegate)?

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

我们有 2 个模型和一个连接模型:

#app/models/message.rb
Class Message < ActiveRecord::Base
has_many :image_messages
has_many :images, through: :image_messages
end

#app/models/image.rb
Class Image < ActiveRecord::Base
has_many :image_messages
has_many :messages, through: :image_messages
end

#app/models/image_message.rb
Class ImageMessage < ActiveRecord::Base
belongs_to :image
belongs_to :message
end

额外属性

我们希望从连接模型( ImageMessage)中提取额外的属性,并在 Message 中访问它们。模型:
@message.image_messages.first.caption # -> what happens now    
@message.images.first.caption #-> we want

我们已经使用 select 实现了这一点。声明关联时的方法:
#app/models/message.rb
has_many :images, -> { select("#{Image.table_name}.*", "#{ImageMessage.table_name}.caption AS caption") }, class_name: 'Image', through: :image_messages, dependent: :destroy

代表

我们刚刚找到了 delegate 方法,这正是它所需要的。但是,它似乎只适用于 has_onebelongs_to协会

我们刚刚使用单个关联进行了此操作,但它似乎不适用于集合(只是将您带到公共(public)方法)

问题

您知道我们可以通过什么方式返回 .caption来自 ImageMessage 的属性通过 Image加入模型模型?

我们目前有这个:
#app/models/image.rb
Class Message < ActiveRecord::Base
has_many :image_messages
has_many :messages, through: :image_messages

delegate :caption, to: :image_messages, allow_nil: true
end

#app/models/image_message.rb
Class ImageMessage < ActiveRecord::Base
belongs_to :image
belongs_to :message

def self.caption # -> only works with class method
#what do we put here?
end
end

更新

感谢 Billy Chan(对于实例方法的想法),我们已经让它非常试探性地工作了:
#app/models/image.rb
Class Image < ActiveRecord::Base
#Caption
def caption
self.image_messages.to_a
end
end

#app/views/messages/show.html.erb
<%= @message.images.each_with_index do |i, index| %>
<%= i.caption[index][:caption] %> #-> works, but super sketchy
<% end %>

任何重构方式,特别是得到它,以便每次 .caption被调用,它返回 image_message.caption该特定记录的值(value)?

最佳答案

delegate只是等效实例方法的简写。这不是一个适合所有人的解决方案,甚至有一些争论认为它并不那么明确。
简单时可以使用实例方法delegate不适合。
我审查并发现在这种情况下任何关联都是不必要的。 ImageMes​​sage的类方法caption更像一个常量,可以直接引用。

def image_message_caption
ImageMessage.caption
end

关于ruby-on-rails - 在 Rails 中使用带有 has_many 的委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20816020/

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