質問

RailsでActiveResourceを使用して、REST経由で別のデータベースのエンティティを管理しています。

リモートリソースのIDを明示的に管理しようとしていますが、現在の場合は、別のフィールドを維持するのではなく、ローカルリソースのIDを再利用するのが最も簡単です。

残念ながら、 ActiveResource :: Base new?のコードは

なので、これを機能させることはできません。
  def new?
    id.nil?
  end

and save

 def save
   new? ? create : update
 end

そのため、定義上、リソースのIDを設定して新しいリソースとして保存することはできません。

create および update は保護されたメソッドです。したがって、ActiveResource :: Baseコードをハッキングした場合、おそらく動作するでしょうが、それを行うのは嫌です。

これを行う正しい方法はありますか?または、私がやろうとしていることは悪いことですか、それはすべきではありませんか?

役に立ちましたか?

解決

ActiveResourceの意図に反して作業しています。 ActiveResourceは、REST Webサービスへのインターフェイスを提供します。RESTWebサービスは、作成時に、割り当てられたIDを慣例により返します。

つまり、使用しているリソースを制御し、新しいレコードを保存するときにIDを取得するようにその動作を変更した場合、ActiveResource :: Baseを変更して準拠させることができます。 Railsの人々が基本クラスに追加や変更を加えることは実際に珍しいことではありません。パッチをlibに入れて、スタートアップのもののどこかに含めるだけです。

必ずしも良いアイデアだとは思いませんが、可能です。 :)

他のヒント

新しいレール(2.3.2でテスト済み)では、保存ロジックが少し変更されたため、IDを設定できます(レコードには、そのid.nilを削除するためのブールフィールド@newrecordがあります)。

record = Model.new
record.id = 123
record.save!
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top