Rails:ActiveResource-IDを明示的に設定できますか?
-
03-07-2019 - |
質問
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!