انعكاس مصدر صالح الكلي: has_many: من خلال
-
20-09-2019 - |
سؤال
ولدي هذه الجمعيات غاضبة: التمويل> - الأحداث> - برامج فرعية> - البرامج. أريد الحصول على الق لlast_financings من البرامج من خلال كل منهم حتى متاحة:
class Fcp < Program
has_many :fcp_subprograms,
:foreign_key => 'parent_id'
has_many :subprogram_last_actual_financings,
:through => :fcp_subprograms,
:source => :last_actual_financings
class FcpSubprogram < Program
belongs_to :fcp,
:class_name => 'Fcp',
:foreign_key => 'parent_id'
has_many :events,
:foreign_key => 'fcp_id'
has_many :last_actual_financings,
:through => :events,
:source => :last_actual_financings
class Event < ActiveRecord::Base
belongs_to :fcp,
:class_name => 'Fcp',
:foreign_key => 'fcp_id'
belongs_to :fcp_subprogram,
:class_name => 'FcpSubprogram',
:foreign_key => 'fcp_id'
has_many :last_actual_financings,
:class_name => 'ActualFinancing',
:order => 'date DESC',
:limit => 1
وهكذا عندما أريد أن الوصول إلى subprogram_last_actual_financings في after_initialize وظيفة أحصل على هذا الخطأ
Invalid source reflection macro :has_many :through for has_many :subprogram_last_actual_financings, :through => :fcp_subprograms. Use :source to specify the source reflection.
ولكن لدي: الخيار مصدر في الجمعيات بلدي. ماذا أفعل الخطأ؟
المحلول
والخطأ الذي تحصل عليه هو حول source_reflection هي جمعية غير صالحة، لأنه مصدر لhas_many يجب أن يكون من خلال belongs_to، has_one أو has_many دون من خلال الخيار. لذلك لا يمكنك استخدام: last_actual_financings كمصدر
نصائح أخرى
وكما بقدر ما أتذكر أنك لا يمكن أن تجعل بالتعاون مع ضعف (أو أكثر): من خلال. الشيء الوحيد الذي يمكنك القيام به هو إرسال استعلامات SQL الخاصة بك.
وهنا هو بلدي على سبيل المثال كيفية القيام بذلك:
class Person
...
has_many :teams, :finder_sql =>
'SELECT DISTINCT teams.* FROM teams
INNER JOIN team_roles ON teams.id = team_roles.team_id
INNER JOIN team_members ON team_roles.id = team_members.role_id
WHERE ((team_members.person_id = #{id}))'
# other standard associations
has_many :team_members
has_many :team_roles,
:through => :team_members
# and I couldn't do:
# has_many :teams, :through => :team_roles
وهذا هو علاقة المسؤول -> has_many -> team_members -> has_many -> team_roles -> has_one - فريق
ونأمل أن يساعد.
وهذا يبدو وكأنه وسيلة محرجا حقا للقيام بذلك ... فما استقاموا لكم فاستقيموا جعل بالأحرى استرجاع الظاهري في Program
أن يدعو شيء من هذا القبيل:
self.subprograms.first.events.first.financings.first(:order => 'date DESC')