0

私が持っている:コントローラで次にインスタンス変数への負荷関連付けを熱望する方法は?モデルで

class CalendarItem < Resource 
    belongs_to :schedule 

    has_many :people 
    has_many :documents 

    acts_as_list scope: :schedule, column: :visual_position 

    validates :schedule, :title, presence: true 
end 

私が反応し、レールとreact_componentをレンダリングしています(しかし、それはすべての違いを作る必要があります)を考慮して
class ScheduleController < ApplicationController 
    def show 
    @calendar_items = CalendarItem.where(schedule: @schedule).includes(:people, :documents) 
    end 

    ... 
end 

= react_component('CalendarItemsList', calendar_items: @calendar_items) 

ただし、関連するデータはビュー(react_component)に渡されず、メインモデルのみが渡されます。

私はこれまでに、反応していないフロントエンドでこれを経験しましたが、どちらもうまくいきませんでした。何が間違っていますか?

+0

空の配列nilを渡すか、エラーをスローしますか? –

+0

私は@caledar_itemsを使うことができますが、人々と文書の関連付けは含まれていません。おかげで – Aurimas

+1

ああ、それは簡単にする必要があります。 'CalendarItem.includes().where()'を試してください。あなたは注文を後方に持っています。 –

答えて

1

問題はインスタンス変数のデータではなく、シリアル化されています。

react_componentビューヘルパーは、文字列でない場合は、2番目の引数のto_jsonメソッドを呼び出します。あなたのケースでは:{calendar_items: @calendar_items}.to_json、再帰的に動作するので、@calendar_items.to_jsonが期待されるJSON出力を返すようにします。あなたはrails consoleでそれをテストするために@calendar_items.serializable_hashを使うことができます、それは人のためにより読みやすいハッシュを返します。

または、データを文字列にシリアル化し、react_componentにフィードします。

私はRails 5のシリアライゼーションを知らないのですが、それはActiveModelSerializersと似ているようですので、シリアライズされた出力に関係を含めることができます:@calendar_items.to_jso(include: [:documents])。 ActiveModelSerializersでは、各クラスにシリアライザを指定し、それらの関係を自動的に指定することができます。

だから、1ワーキングソリューションは次のようになります。

def show 
    calendar_items = CalendarItem.where(schedule: @schedule).includes(:people, :documents) 
    @react_component_props = { calendar_items: calendar_items.to_json(include: [:people, :documents]) } 
end 

= react_component('CalendarItemsList', @react_component_props) 

ささやかなヒント:あなたはそう後で、あなたがそれを使用することができ、CalendarItemモデルにby_scheduleスコープを作成することができます。CalendarItem.by_schedule @schedule

EDIT

ビュー内の他の場所にデータが必要な場合は、as_jsonメソッドを使用できます。

01予想通り

@calendar_items = CalendarItem.where(schedule: @schedule) 
           .as_json(include: [:people, :documents]) 

このロード/アソシエーションをシリアライズ:

def show 
    calendar_items_scope = CalendarItem.where(schedule: @schedule).includes(:people, :documents) 
    @calendar_items = calendar_items_scope.as_json(include: [:people, :documents]) 
end 
+0

ありがとう、それは動作するように見えます! @react_component_propsは部分オブジェクト部分jsonなので、フロントエンドで後処理を行う必要がありますが、これはあまり素敵ではありません。 @react_component_propsをオブジェクトにする方法はありますか? (アソシエーションを含む)。私はそれが '.to_json'が2回呼び出されていることを推測しています。(?) – Aurimas

+0

それについては忘れてしまいます。このように完璧に動作します:' @calendar_items = calendar_items.as_jsonドキュメント)] '' calendar_items'はインスタンスではなくローカルvarです。 – Aurimas

+0

これをソリューションに追加することができれば、使用中のまま受け入れることができます。 ...ここで 'as_json'がうまく動作します – Aurimas

0

溶液回避策はas_jsonを追加し、そこassociatiosnを含むことです。

関連する問題