問題タブ [single-table-inheritance]
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.
sql-server-2008 - SQL Server 2008で継承されたテーブル。パフォーマンスの問題?
私は、どこかで読んだ別の概念に基づいて、頭の中でじっくり考えてきたこの考えを持っています。基本的に、フィールドが非常に少ない単一の「プライマリ」テーブルがあり、他のテーブルは外部キーを介してそのプライマリテーブルを継承します。これは以前に行われたことがあるので、ニュースはありません。私がやりたいのは、データベース内の実質的にすべてのテーブルがそのプライマリテーブルから継承するようにすることです。このように、すべてのオブジェクト、すべてのレコード、すべてのテーブルのすべてのエントリは、完全に一意の主キーを持つことができ(PKは実際にはプライマリテーブルに格納されているため)、テーブルではなくIDで簡単に参照できます。
もう1つの利点は、複数のテーブルにアクセスできる関係を簡単に作成できることです。例:トランザクションテーブルがあり、このテーブルは、トランザクションの対象(在庫、アカウント、連絡先、注文など)にFKを設定したいと考えています。トランザクションはプライマリテーブルへのFKを持つことができ、必要なデータはそれを介して参照されます。
私の頭に浮かぶ問題は、そのプライマリテーブルがボトルネックになるかどうかです。ある時点で文字通り何百万ものレコードが存在することになります。巨大なレコードセットは優れたテーブルデザインで処理できることを知っていますが、制限は何ですか?
誰かがこれに似た何かを試みましたか、そしてあなたの結果はどうでしたか?
ruby-on-rails - :typeフィールドはどのようにして単一テーブル継承に入力されますか?
コンテンツを管理するために構築しているシンプルなアプリでデータを構造化する方法について、以前に質問しました。答えは、単一テーブル継承を調べることでした。それがチケットになると思います。
私はかなりの数の例を読みましたが、常に省略されているように見えることの1つは、:type列が実際にどのように入力されるかです。ユーザーがタイプを選択できるように、ドロップダウン付きのフォームフィールドを含めますか?
私はSTIがどのように機能するかを完全に理解していると思います(タイプフィールドはクラス名を取ります)が、それでも非常に基本的なものが欠けています(そしておそらく非常に明白ですが、私はそれを見逃しています)。誰かが私に記入できますか?
私は次のような目次を持っています:
そして、異なるタイプは「サイト」、「ブログ」、「写真」になります。
ruby-on-rails - is_a?Rails3の単一テーブル継承で失敗する
Object#is_a?
Rails 3で最も奇妙な方法で失敗しています。私は単一テーブル継承を次のように設定しています(簡潔にするために簡略化)。
私のコントローラーには、次のものがあります。
アクションを呼び出すと、#create
次のログ結果が生成されます。
Video
インスタンスはですが、ActiveRecord::Base
ではないことに注意してくださいResource
。これは単なる学術的な関心事ではありません。アクションから呼び出されたフレームワークコードはis_a?
、型の不一致をチェックするために使用し、Video
がではないと判断したときに発生しResource
ます。
ただし、Railsコンソールでは、 is_a?(Resource)
trueを返します。
ここで何が起こっているのでしょうか?
polymorphic-associations - 単一継承または多形?
私は、ユーザーが販売しているさまざまな種類のアイテムの詳細なフィールドを含む求人広告を投稿できるWebサイトをプログラミングしています。ただし、最適なデータベーススキーマについて質問があります。
このサイトには多くのカテゴリ(自動車、コンピュータ、カメラなど)があり、広告の各カテゴリには独自のフィールドがあります。たとえば、車にはドアの数、メーカー、モデル、馬力などの属性があり、コンピューターにはCPU、RAM、マザーボードモデルなどの属性があります。
これらはすべてリストであるため、さまざまなカテゴリ(COMPUTERS、CARS、CAMERAS)ごとに親LISTINGSテーブルと異なる子テーブルを作成する多態的なアプローチを考えていました。各子テーブルには、LISTINGSTABLEにリンクするlisting_idがあります。したがって、リストがフェッチされると、関連付けられた子テーブルのリンクされた行によって結合されたLISTINGSから行がフェッチされます。
さて、このスキーマは優れたデザインパターンですか、それともこれを行うためのより良い方法がありますか?
私は単一の継承を検討しましたが、テーブルがすぐに大きくなりすぎるため、すぐに考えを一掃しましたが、別のジレンマが思い浮かびました-ユーザーがすべてのリストでグローバル検索を行う場合、それは各子にクエリを実行する必要があることを意味します個別にテーブル。100を超えるカテゴリがある場合はどうなりますか?非効率的ではないでしょうか。
また、各カテゴリのフィールドを定義するマスターテーブル(メタテーブル)と各リストのフィールド値を格納するフィールドテーブルがある別のアプローチを考えましたが、それはデータベースの正規化に反しますか?
Kijijiのようなサイトはどのようにそれを行いますか?
ruby-on-rails - Rails: STI を使用してテーブルのフィクスチャを読み込めません (未定義のメソッド `reflect_on_all_associations')
STI を使用するテーブルにフィクスチャをロードできません。
を呼び出すとFIXTURES=schools rake db:fixtures:load
、次のエラーが発生します。
- 他のフィクスチャは正常にロードされます。
FIXTURES=committes rake db:fixtures:load
- フィクスチャは呼び出しによって作成されました
rake db:fixtures:extract
これが私の学校の移行です:
いくつかのモデル ファイルがありますschool.rb
。
そしてsecondary_school.rb
:
スタック トレースは次のとおりです。
そしていくつかのサンプル YML:
ruby-on-rails - 1ページのモデル、さまざまなレイアウト/ビュー。どうすればSTIを活用できますか?
Railsを学ぶために作成しているアプリがあります。これは、awesome_nested_setを使用してネストされたページを作成する単純なページマネージャーです。STIを使用したいのですが、それを機能させる方法がわかりません。私が見たSTIの例のほとんどは、メインの「ペット」モデルと「犬」と「猫」のサブモデルを含んでいます。私はそれを実際の例にするのに苦労しています。これが私がページをどのように使用しているかです。
3つの異なるページの「タイプ」:ブログ、写真、モバイル写真。これを実際に説明する唯一の方法は、Coldfusion Blog、Photo、MobilePhotosに組み込まれている私の現在のサイトを表示することです。
すべて同じテーブルとほぼ同じ属性を使用します。写真セクションは写真属性を使用し、アップロード、サイズ変更などの小さな変更がありますが、それ以外はすべてが異なる「タイプ」間で同じです。ページタイプの主な違いは、ページのレイアウト方法とアクセス方法です。例えば:
インデックス上:
/photos-「写真」のタイプですべてのページを表示するレイアウトサムネイル/blog-
「ブログ」のタイプですべてのページを表示するレイアウト
ショーで:
/ photos/1-前/次の写真付きの大きな写真を表示
/blog/2-前/次のエントリ付きのブログエントリを表示
タイプごとに個別のコントローラーが必要ですか?ページの作成/更新方法を変更する必要がない場合、個別のモデルが必要ですか?必要なレイアウトをレンダリングするアクションを指すルートを作成するだけですか?私は「STI」という言葉を目にしていて、それを必要以上に難しくしていると思います。「レールウェイ」を学びたいので、気をつけているだけです。STIも必要ですか?
どんな助けでも大歓迎です、私はこのこぶを乗り越える必要があります、誰かがそれを「クリック」させるのを手伝ってください!:)
ruby-on-rails - Rails - メインクラス、サブクラス、サブクラスですべてのレコードを取得する方法
STI を使用して、特定の :type のすべてのページを取得しようとしています。
pages_controller.rb にメインクラスがあります
その下には、pages_controller.rb に別のクラスがあります。
Blog クラスは、:type が「Blog」のすべてのページを取得するべきではありませんか? 代わりに、タイプに関係なくすべてのページを取得しています。@pages = Page.where(:type => "Blog")
また、URL http://localhost:3000/blogにアクセスしてみました
これが私のルートです
ruby - 単一テーブル継承の場合のフォームヘルパー
タイプがTeacher、Student、Outsiderである可能性のあるクラスPersonに対して、単一テーブル継承を実装する必要があります。
新しいユーザーを登録するときに、ルートとフォームにどのような変更を加える必要がありますか。新しいユーザーを登録するためのフォームのドロップダウンとして実装できるpeopleテーブルにcolumn(string)"type"があります。ユーザーが特定のタイプの個人として登録されるように、フォームで他に行う必要があることはありますか?ルートも変更する必要がありますか?
ruby-on-rails - 単一テーブルの継承を実装した後に壊れた Rails ルート
個人クラスの単一テーブル継承を実装しました
そして create person は form.select で選択されたものに応じて Teacher、Student、または Person を作成し、 type 属性が追加されているようです。
しかし、私はルートを壊したようです
<%= link_to 'Edit', edit_person_path(@deal) %> | <%= link_to 'Back', person_path %>
それらは、person_path の代わりに teacher_path、student_path、および outsider_path を指しているようです。
ルートにどのような変更を加える必要がありますか?
ruby-on-rails - レールで STI サブクラスのルートを処理するためのベスト プラクティス
Rails のビューとコントローラーにはredirect_to
、 、link_to
、およびform_for
メソッド呼び出しが散らばっています。とは、リンクしているパスで明示的であることもlink_to
ありますが (例: )、多くの場合、パスは暗黙的です (例: )。redirect_to
link_to 'New Person', new_person_path
link_to 'Show', person
モデルにいくつかの単一テーブル継承 (STI) を追加すると (たとえばEmployee < Person
)、これらのメソッドはすべてサブクラスのインスタンスに対して壊れます (たとえばEmployee
)。rails を実行するlink_to @person
と、 でエラーが発生しundefined method employee_path' for #<#<Class:0x000001022bcd40>:0x0000010226d038>
ます。Rails は、employee であるオブジェクトのクラス名によって定義されたルートを探しています。これらの従業員ルートは定義されておらず、従業員コントローラーがないため、アクションも定義されていません。
この質問は以前に尋ねられました:
- StackOverflowでの答えは、コードベース全体で link_to などのすべてのインスタンスを編集し、パスを明示的に記述することです
- 再びStackOverflow
routes.rb
で、サブクラスのリソースを親クラスにマップするために使用することを2人が提案しています (map.resources :employees, :controller => 'people'
)。同じSOの質問の一番の答えは、コードベース内のすべてのインスタンスオブジェクトを型キャストすることを提案しています.becomes
- StackOverflowでのさらに別の回答では、一番の答えは Do Repeat Yourself キャンプの方法であり、すべてのサブクラスに複製の足場を作成することを提案しています。
- ここでも同じ質問が SO にあり、一番上の答えが間違っているようです (Rails マジック Just Works!)。
- Web の他の場所で、F2Andy がコード内のあらゆる場所でパスを編集することを推奨しているこのブログ投稿を見つけました。
- ブログ記事「Single Table Inheritance and RESTful Routes at Logical Reality Design」では、上記の SO の回答 2 のように、サブクラスのリソースをスーパークラス コントローラーにマップすることをお勧めします。
- Alex Reisner は、Single Table Inheritance in Railsの記事を投稿しています。その中で彼は、子クラスのリソースを親クラスにマップすることに反対することを提唱してい
routes.rb
ます。そのため、代わりに、親クラスにメソッドを追加して、サブクラスがそのクラスについて嘘をつくようにすることをお勧めします。良さそうですが、彼の方法ではエラーが発生しました。link_to
redirect_to
form_for
undefined local variable or method `child' for #
したがって、最もエレガントに見え、最もコンセンサスが得られる答えは (ただし、それほどエレガントではなく、コンセンサスもそれほど多くありません)、リソースを に追加することroutes.rb
です。ただし、これは では機能しませんform_for
。私はいくつかの明確さが必要です!上記の選択肢を要約すると、私のオプションは次のとおりです。
- サブクラスのリソースをスーパークラスのコントローラーにマップします
routes.rb
(サブクラスで form_for を呼び出す必要がないことを願っています) - Rails の内部メソッドをオーバーライドして、クラスを相互に関連付けます。
- オブジェクトのアクションへのパスが暗黙的または明示的に呼び出されるコード内のすべてのインスタンスを編集し、パスを変更するか、オブジェクトを型キャストします。
これらすべての相反する答えがあるので、裁定が必要です。良い答えはないように思えます。これはレールの設計に失敗していますか? もしそうなら、それは修正されるかもしれないバグですか?または、そうでない場合は、誰かがこれについて私をまっすぐに設定し、各オプションの長所と短所を説明して(またはそれがオプションではない理由を説明して)、正しい答えとその理由を教えてくれることを願っています. それとも、ウェブ上で見つけられない正しい答えはありますか?