問題タブ [has-one-through]
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-4 - rails 4 "chained" has_one: :through リレーションは永続化されたオブジェクトでは機能しますが、新しいオブジェクトでは機能しません
私はかなり複雑なモデル設定をしています:
上記の 2 つのクラスには名前空間がありませんが、以下の関連するモデルはすべて名前空間に存在することに注意してくださいBilling
。
私の問題はVendorLineItem
、関連付けられた に到達する必要があるクラスにありresource
ます。
永続化されたデータを使用している場合は、すべて問題ありません。Rails コンソールで:
OTOH、新しいインスタンスで作業している場合、resource
nil として返されます(レールは試行さえしません; SQLは発行されません)。
しかし、関連付けの明示的なチェーンを介してリソースにアクセスできます。
has_one :contract_resource, through: :unit_rate
問題なく関連付けを通じてリソースを見つけることもできます。
なぜhas_one: resource, through: :contract_resource
協会はここで機能していないのですか?
ruby-on-rails - ActiveRecord カスタム has_one リレーション
Rails 5.0.0.1 ATM を使用していますが、DB リクエストの数を最適化する際に ActiveRecord 関係の問題に遭遇しました。現在、モデル A ('Orders' としましょう)、モデル B ('OrderDispatches')、モデル C ('Person')、モデル D ('PersonVersion') があります。
テーブル 'people' は 'id' と 'hidden' フラグのみで構成され、残りの人物データは 'person_versions' ('name'、'surname'、および学名など、時間の経過とともに変化するもの) に格納されます。
すべての Order には、DB に注文を記録した人に関する「recoming_person_id」があり、すべての OrderDispatch には、注文を配達した人に関する「dispatching_person_id」があります。また、Order と OrderDispatch には作成時間があります。
1 つの注文で複数の発送があります。
したがって、直接的な関係は次のとおりです。
しかし、ディスパッチに応じて注文をリストすると、N + 1 の状況に対処する必要があります。なぜなら、(Order/OrderDispatch の作成日に従って) 正確な PersonVersion をすべての receive_person_id および dispatching_person_id に対して見つけるために、別のリクエストを行っているからです。
初め '?' Order/OrderDispatch の作成日と 2 番目の「?」受発注者IDです。
このクエリを使用して、Order/OrderDispatch 作成時の正確な個人データを取得しています。
生のSQLでサブクエリ(またはOrderが1つのリストにOrderDispatchesを伴うため、サブクエリ)を使用してクエリを作成するのはかなり簡単ですが、ActiveRecordを使用してそれを行う方法がわかりません。
これは私が来た限りであるため、カスタム has_one リレーションを記述しようとしました:
これを受取人または発送人にのみ使用すると機能します。結合された注文と order_dispatches テーブルに対してこれをeager_loadしようとすると、「person_versions」の1つをエイリアスする必要があり、カスタムwhere句ではそうではありません(エイリアスされるかどうかを予測する方法はなく、両方の方法で使用されます) .
別のアプローチは次のようになります。
サブクエリにあり、シンボル ':id' を使用すると、生の SQL が注文と order_dispatches に結合された person_versions テーブルの正しいエイリアスを取得するため、生の 'person_versions' は問題ありませんが、person_versions.id の 'equals' ではなく 'IN' を取得します。 xx サブクエリと MySQL は、IN/ANY/ALL ステートメントで使用されるサブクエリで LIMIT を実行できないため、ランダムな person_version を取得します。
したがって、TL;DR 'has_many through' を 'has_one' に変換する必要があります。カスタムの 'where' 句を使用して、元のレコード作成よりも日付が古いものの中から最新のレコードを探します。
編集: 簡略化のための別の TL;DR
これを「eager_load」できるように、このメソッドを「has_one」リレーションに変換する必要があります。
ruby-on-rails - Rails 4 API: ネストされたリソースの作成
私は3つのモデルを持っています:
Repositionings
しかし、私はコントローラーしか持っていません。私のアプリでは、ユーザーは を に追加できmood
、repositioning
データは次のように API に送信されます。
必要なrepo_mood
エントリを生成する簡単な方法はありますか:
手動で呼び出すことなく?Railsビューでネストされたフォームのように考えています。
ruby-on-rails - has_one でも has_one のビルド メソッド
レール 5.1.2 ルビー 2.5.3
この関係を暗示する方法は複数あることは理解していますが、この質問は、実際の問題を解決するというよりも、以下が機能しない理由に関するものです。
has_many
設定
リレーションシップを使用するように設定されている上記のSubscriber
モデルでは、次のように動作します。has_many
それに続いて、私は関係Subscriber
と同じように振る舞うことを期待しますhas_one
has_one
設定
promotion
ただし、同等のhas_one
ビルド メソッドを使用してネストされた関連付けをビルドしようとすると、NoMethodError (undefined method 'build_promotion' for #<Subscriber:0x00007f9042cbd7c8>)
エラーが発生します。
ただし、これは機能します。
has_one
ネストされた関係を構築するのと同じ方法で構築することを期待するのは当然だと思いますhas_many
。
これはバグですか、それとも仕様ですか?
php - has-one-through でリレーションを作成できません
has-one-throughで関係を作ろうとしています。
テーブル:
Package.php で