5

Report と Chart の間に単純な has_many/belongs_to 関係があります。私が抱えている問題は、私の Chart モデルが子を持つ親であることです。

だから私のレポートモデルでは

class Report < ActiveRecord::Base
  has_many :charts
end

そして、私の Chart モデルは親であり、Pie、Line、Bar はすべて Chart から継承されます。belongs_to :report がチャート モデルまたはチャート モデルの子のどこに属しているかわかりません。オブジェクトのタイプが「クラス」であるため、chart.report にアクセスしようとするとエラーが発生します。

#< Class:0x104974b90> の未定義のローカル変数またはメソッド `report'

チャートモデルはSTIを使用しているため、チャートテーブルのchart_type列から「性別」と言う..何が欠けていますか?

編集

      Chart
      /  \
    Pie  Line
    / \
   /   \
Gender Sex

私は (STI を使用して) Gender または Sex 型のオブジェクトをインスタンス化しています。うまくいけば、これはもう少し役立ちます。

私はそれが原因であると感じています

@chart.update_attributes(params[:chart])

送信されたとき、実際には params[:chart] その params[:gender] または params[:sex]

4

4 に答える 4

2

あなたはちょうど使用できるはずです

class Report < ActiveRecord::Base
  has_many :charts
end

class Chart < ActiveRecord::Base
  belongs_to :report
end

そして電話する

@chart.report
@pie.report
@line.report
@bar.report
于 2010-06-14T18:00:38.857 に答える
2

問題は、これらの異なるタイプのモデルをすべて受け取るコントローラーが 1 つあることです。Rails フォーム ヘルパーを使用すると、インスタンスからオブジェクト タイプが取得され、それを使用してパラメーターが入力されます。これは、params[:gender]代わりにparams[:chart]

これは、Rails がフォームの生成に使用するメソッドをオーバーライドすることで修正できます。次のコードをベース チャート クラスに追加します。

def self.model_name
  name = "chart"
  name.instance_eval do
    def plural;   pluralize;   end
    def singular; singularize; end
  end
  return name
end

これで、Chart の子であるクラスはすべて、受信アクションに次のように渡されます。params[:chart]

上で概説したようにオブジェクト名を変更すると、それに依存する一部のプラグイン/宝石の機能が壊れる可能性があることに注意してください。複数のコントローラーを持つことを検討する必要があります。ChartsControllerですべてのデータを受信する代わりに、GenderChartsControllerと を使用しLineChartsControllerます。これには、次の 2 つの利点があります。

  1. オブジェクト名を変更する必要はありません
  2. 将来、特定の種類のグラフのカスタム コードが必要になった場合、別のコントローラーによって分離されているため、機能させるために条件ステートメントを追加する必要はありません。
于 2010-06-29T17:30:20.070 に答える
1

すべてのグラフ タイプがレポートに属している場合は、

所属先:レポート

親モデル(あなたの場合はチャートモデルだと思います)。

于 2010-06-14T16:54:17.510 に答える
0

明示的に上書きしない限り、chart_type列の名前を単にに変更する必要があります。typeBase.inheritance_column

単一テーブル継承列の名前を明示的に変更しましたchart_typeか?

于 2010-06-29T11:36:01.517 に答える