Rails (4.0.0)ではこれを行うことができます。現在、2 つの方法があります。
1. SQL「エイリアス」列
Rails の has_many :through のスコーピングによる追加データへのアクセス
#Images
has_many :image_messages, :class_name => 'ImageMessage'
has_many :images, -> { select("#{Image.table_name}.*, #{ImageMessage.table_name}.caption AS caption") }, :class_name => 'Image', :through => :image_messages, dependent: :destroy
2. ActiveRecord アソシエーション拡張
これは Rails のあまり知られていない機能で、collection
オブジェクトをいじることができます。その方法は、has_many
作成した関係を拡張することです。
class AccountGroup < ActiveRecord::Base
has_many :accounts do
def X
#your code here
end
end
end
このメソッドはコレクションに対してのみ機能しますが、あらゆる種類の操作を行うことができます。詳細については、このチュートリアルを参照してください。
アップデート
拡張モジュールを使用して、これを機能させました。
#app/models/message.rb
Class Message < ActiveRecord::Base
has_many :image_messages #-> join model
has_many :images, through: :image_messages, extend: ImageCaption
end
#app/models/concerns/image_caption.rb
module ImageCaption
#Load
def load
captions.each do |caption|
proxy_association.target << caption
end
end
#Private
private
#Captions
def captions
return_array = []
through_collection.each_with_index do |through,i|
associate = through.send(reflection_name)
associate.assign_attributes({caption: items[i]})
return_array.concat Array.new(1).fill( associate )
end
return return_array
end
#######################
# Variables #
#######################
#Association
def reflection_name
proxy_association.source_reflection.name
end
#Foreign Key
def through_source_key
proxy_association.reflection.source_reflection.foreign_key
end
#Primary Key
def through_primary_key
proxy_association.reflection.through_reflection.active_record_primary_key
end
#Through Name
def through_name
proxy_association.reflection.through_reflection.name
end
#Through
def through_collection
proxy_association.owner.send through_name
end
#Captions
def items
through_collection.map(&:caption)
end
#Target
def target_collection
#load_target
proxy_association.target
end
end
変数関数のこの要点への小道具
これは基本的に、クラスのload
ActiveRecord 関数をオーバーライドし、それを使用して独自の配列を作成します:)CollectionProxy
proxy_association.target
実装方法に関する情報が必要な場合は、コメントで質問してください