Używanie Delegata z has_many In Rails?
Mamy 2 modele i model łączenia:
#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
Dodatkowe atrybuty
Chcemy wyodrębnić dodatkowe atrybuty z modelu łączenia (ImageMessage
) i udostępniaj je wMessage
Model:
@message.image_messages.first.caption # -> what happens now
@message.images.first.caption #-> we want
Osiągnęliśmy to już za pomocąselect
metoda przy deklarowaniu powiązania:
#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
Delegat
Właśnie znaleźliśmydelegate
metoda, która dokładnie odpowiada potrzebom. Jednak wydaje się, że działa tylkohas_one
ibelongs_to
wspomnienia
Właśnie to działa z jednym skojarzeniem, ale wygląda na to, że nie działa dla kolekcji (przenosi cię do metody publicznej)
Pytanie
Czy wiesz, w jaki sposób możemy zwrócić.caption
atrybut zImageMessage
połącz model za pomocąImage
Model?
Mamy to obecnie:
#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
Aktualizacja
Dzięki Billy'emu Chanowi (dla idei metody instancji) działamybardzo wstępnie:
#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 %>
Jakikolwiek sposób na refaktorowanie, szczególnie po to, by za każdym razem go zdobyć.caption
jest wywoływany, zwracaimage_message.caption
wartość dla tego konkretnego rekordu?