問題タブ [sti]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - Rails デザイン パターン: 特定の関数をオーバーライドする多数の子モデル
rake タスクで 50 個のファイルを作成するために約 50 回呼び出されるモデルがあります。
コードの約 90% は再利用できますが、いくつかのメソッドをオーバーライドする必要があります。元のテーブルから継承することだけを考えていましたが、これは約 40 ~ 50 のモデルにつながる可能性があり、適切ではないと感じました。
各モデルでオーバーライドする必要があるメソッドは、おそらく 3 ~ 4 個程度です。
私が持っていた他のアイデアは、この投稿から MODULE + EXTEND + SUPER DECORATOR を使用することでした: http://robots.thoughtbot.com/post/14825364877/evaluating-alternative-decorator-implementations-in Ie
次に、50 個のモジュールを用意し、作成時に適切なモジュールを拡張します。
では、どちらが最良の選択肢でしょうか、またはこの状況に適したパターンはありますか?
ruby-on-rails-3 - Rails3.2新しいレコードのみに対してbefore_validationを呼び出す方法
Rails3.xbefore_validation(:on => :create) doは機能しません。他のアイデアはありがたい
sql - RailsSTIとサブクラスの関連付け
STIを使用しているときにrails3とのhas_manyアソシエーションからコレクションをフェッチすると、奇妙な動作が発生します。私は持っています:
望ましい動作は、branch.employeesブランチ管理者を含むすべての従業員を返すことです。ブランチ管理者は、によってアクセスされた場合にのみ、このコレクションの下に「ロード」されているように見えますbranch.admins。これは、コンソールから出力されます。
これは、生成されたSQLで初めて確認できます。
そして2回目:
次のように指定するだけで、この問題を解決できます。
それらはすべてbranch_idから検出されますが、これを実行したい場合はコントローラーで問題が発生するためbranch.employees.build、クラスはデフォルトでデフォルトにUserなり、どこかのタイプ列をハックする必要があります。私は今のところこれを回避しました:
でも、できればこれは避けたいです。誰か、何かアイデアはありますか?
編集:
finder_sqlとcounter_sqlは、親の関連付けがこれを使用していないようで、選択にクラスのみが含まれるため、実際には解決してorganisation.employeesいません。has_many :employees, through: :branchesUser::Employee
ruby-on-rails - Railsの雇用主と従業員の工夫
これを構造化する方法を見つけようとしています。助けてください: ユーザーが雇用主または従業員としてサインアップできるようにする必要があります。雇用者は基本的に会社であり、従業員はその仕事で雇用されている人々です。従業員がいつ採用され、いつ解雇されたかを記録する方法を知りたいです。アソシエーションはこれに対して機能しますか、has_many:throughそれともそれ以上に機能しますか?
ruby-on-rails-3 - Rails 3は、ユーザーが10を超える所有者である場合、データベース内の最も古いアイテムを破棄します
Rails3でSTIを使用して設計したアクティビティストリームがあります。
ユーザーが作成時に10を超えるアクティビティアイテムを持っているかどうかを確認したいと思います。ユーザーがデータベースに11番目のアクティビティを作成するときに、最も古いレコード*基本的にユーザーが作成した最初のレコードなどを破棄するようにします。*このようにして、データベースから何千もの古い役に立たないレコードをクリーンに保ちます。
モデルレベルから始めることを想定していますが、モデルで「current_user」を定義したくないので、コントローラーに含める必要があります。
このタスクを実行するために助けをいただければ幸いです。私は、Railsでのこれらのタイプのより高度なタスクにかなり慣れていません。
ruby-on-rails - ポリモーフィックな関連付けを持つRails STIモデル、熱心な読み込みクエリが間違ったクラスタイプを参照する
ここではRails 2.3.14を使用していますが、この特定のバージョンに限定されない問題が発生する可能性があります。これはすべて、Rails 3 にまだ存在するアソシエーションと熱心な読み込み機能であり、2.3.14 よりもかなり前から存在していました。私はレール 2.3.8 からのアップグレードの過程にあり、以下に説明する問題はありませんでした。
以下のコードは、はるかに複雑な生産システムに基づくモックアップです。私が概説しているクラス/モジュールスキームは、理由によりこのように設定されています。このモックアップには、問題を説明するために必要以上の詳細が含まれています。うまくいけば、システムの全体的な構造がより明確になります。
車両 (車/トラック) やゴルフ ボールなど、「運転」できるドメイン オブジェクトがいくつかあるとします。これらのそれぞれについて、ActiveRecord クラスがあります。
最初に、GolfBallはトップレベルのモデル クラスであり、対応するデータベース テーブルはgolf_ballsです。一方、CarとTruckは のサブクラスですVehicle。車両用のデータベースはSTIで設定されているのでCars、 と両方ともテーブルTrucksに対応しています(列微分器付き)。vehiclestype
Drivable次に、すべての最下位レベルのドメイン オブジェクト ( Car、Truck、 ) にモジュールを含めていることに注意してください。GolfBallこれは次のようになります (実際のシステムでは、このモジュールは、特定のものに基づいて物事を設定するなど、さらに多くのことを行います。ドメイン オブジェクト):
したがって、これらのそれぞれにを含めることができ、インクルード クラス名に基づいてDriverを使用しています (たとえば、クラスをインクルードすると with になります)。これらの参照されるクラス (など) にはそれぞれに必要な特定のビジネス ロジックが含まれているためです。協会の使用。:class_nameCarhas_one:class_name => "CarDriver"CarDriver
Driverポリモーフィック アソシエーションをセットアップする最上位クラスと、ドメイン オブジェクト ドライバー用の上記と同様のサブクラス階層があります。
これは、単一のデータベース テーブルに基づいており、driversすべてのサブクラスに STI を使用しています。
このシステムを配置したら、新しいCar(以下に保存されて@carいる) を作成し、このように新しく作成されたものと関連付けCarDriverます (このモックアップでは、実際のシステムの動作を反映するために、これらの特定の順次ステップに分割されています)。
vehiclesこれにより、次のようにテーブルにデータベース行が作成されました。
そして、driversこのようなテーブルの行:
Vehicle車両がSTIであるためとはdriveable_type対照的です。Carここまでは順調ですね。ここで、Rails コンソールを開き、簡単なコマンドを実行してCarインスタンスを取得します。
ログによると、実行されたクエリは次のとおりです。
次に、次を取得しCarDriverます。
これにより、このクエリが実行されました。
ただし、熱心な読み込みを使用しようとすると、異なる結果が得られます。新しいコンソール セッションから、次を実行します。
これnilは、ドライバーにとっての結果となります。ログを確認すると、最初のステートメントで次のクエリが実行されます (通常のクエリと熱心な読み込みクエリ)。
ご覧のとおり、熱心な読み込みの場合、Carクエリは上記と同じですが、CarDriverクエリは異なります。ほとんど同じですが、非イーガー ローディングの場合と同様に、drivers.driveableタイプの場合はCarSTI 基底クラス名を探すべき場所を探します。Vehicle
これを修正する方法はありますか?
ruby-on-rails - ActiveRecordは、STIクラスを対象とするスコープを介して間違ったクラスのインスタンスを構築します
buildSTIタイプを介して特定のクラスのモデルをターゲットとするスコープでメソッドを呼び出し、ActiveRecordに正しいクラスのインスタンスを構築させたいと思います。
DiscountLineItemここでは、のインスタンスではなく、のインスタンスを期待していましたLineItem。
ruby-on-rails - レールが単一テーブル継承でbelongs_toにタイプを含めるのを停止します
Railsがbelongs_toアソシエーションに不要な(私が思う)句を追加しているという問題があります-アソシエーションが外部キーを使用している場合でも、タイプを制限します。
STIの設定は次のようになります。
したがって、の主キー列IDにリンクする列がありFoo、はSTIの下にあります。私はこれらすべてに満足しています。apple_idfruitsAppleFruit
今:
Railsが追加されるのはなぜAND "fruits"."type" IN ('Apple')ですか?これはテーブルの主キーを使用するbelongs_tofruitsであるため、タイプ部分は冗長に見えます。レールがその部分をルックアップに追加するのを止めて、これを取得できますか?
Fooでできることはわかっていbelongs_to :apple, :class_name => "Fruit"ますが、オブジェクトが返されたときにオブジェクトが自動的にApplesになるようにします。
誰かが私の動機に疑問を投げかけた場合...type句が他のテーブルにクエリを実行するときにpostgresが選択するクエリプランを台無しにしているので、これを実行したいと思いますfruits(はい、私はインデックスを持っていてtype、マルチを試しました-列1 [type,id])。ここで完全に説明するのは少し複雑/無関係です。
mysql - STI MySQL fun select as with case
私は次のSTIセットアップを持っています:
次の構造を返すAnimalsテーブルでselectを実行したいと思います。
理想的には、次のようなものが欲しいです。
しかし、それは機能しないので、私はこれを行いました:
最初のクエリを機能させる方法はありますか?そうでない場合は、2番目のクエリを作成するためのより良い/代替の方法がありますか?