なぜすべてのアクティブレコードが嫌いですか?[閉まっている]


103

OOPについてますます学び、さまざまなデザインパターンを実装し始めると、人々がActive Recordを嫌うケースに戻ってきます。

多くの場合、(Twitterを主な例として引用して)うまくスケールしないと言われますが、実際にうまくスケールしない理由を実際に説明する人はいません。および/または短所なしでARのプロを達成する方法(類似しているが異なるパターンを介して?)

うまくいけば、これがデザインパターンに関する神聖な戦争にならないことを願っています-私が知りたいのは、****具体的に**** Active Recordの問題点だけです。

うまくスケーリングしない場合は、どうしてですか?

他にどんな問題がありますか?


9
一般に、デザインパターンに対する多くの嫌悪感や嫌悪感は、誤った使用に関連していると思います。人々は使いすぎて間違った状況で使用する傾向があり、元のソリューションよりも複雑なソリューションになって
しまう

1
RubyのActive Record実装はORMに似ています。
ジミーT.

1
感謝を得るために、より認識され、賢くて最先端のように見える社会的現象があり、人々は現在の標準、モデル、広く採用されている技術の否定の誇大宣伝を機械的に繰り返す傾向があり、次の波への革命的な進歩。
Andre Figueiredo 2017年

回答:


90

ありますActiveRecordのは、デザインパターンActiveRecordをRailsのORMライブラリ、および.NET用ノックオフ、および他の言語のトンもあります。

これらはすべて異なるものです。彼らは主にそのデザインパターンに従いますが、それをさまざまな方法で拡張および変更するため、「ActiveRecordはサックする」と言う前に、「どのActiveRecord、ヒープがあるか」と言って修飾する必要があります。

私はRailsのActiveRecordにのみ精通しているので、それを使用する状況で発生したすべての苦情に対処してみます。

@BlaM

Active Recordsで私が目にする問題は、常に1つのテーブルにすぎないということです。

コード:

class Person
    belongs_to :company
end
people = Person.find(:all, :include => :company )

これはSQLを生成します LEFT JOIN companies on companies.id = person.company_id、関連付けられたCompanyオブジェクトが自動的に生成されるpeople.first.companyので、データを既に取得しているので、データベースにアクセスする必要がありません。

@ pix0r

Active Recordに固有の問題は、データベースクエリが自動的に生成および実行され、オブジェクトにデータを入力してデータベースレコードを変更することです。

コード:

person = Person.find_by_sql("giant complicated sql query")

これは見苦しいのでお勧めできませんが、単純で生のSQLを記述する必要があるだけの場合は、簡単に実行できます。

@ティム・サリバン

...モデルの複数のインスタンスを選択すると、基本的には「select * from ...」を実行します

コード:

people = Person.find(:all, :select=>'name, id')

これにより、データベースから名前とID列のみが選択され、オブジェクトを手動で再ロードしない限り、マップされたオブジェクト内の他のすべての「属性」はnilになります。


強大!その特定の機能については知りませんでした。私の兵器庫に入れるための、私にとってのさらにもう一つの賛成論。
Tim Sullivan

結合は、Active Recordパターンを超えています。
ジミーT.

「Person.find_by_sql」はアクティブレコードパターンではありません。その「アクティブレコード」はほとんど失敗したため、手動でパッチを適用する必要があります。
magallanes 2016年

52

ActiveRecordは、モデルが比較的フラットである(クラス階層の多くではないなど)、迅速なCRUDベースのアプリケーションに適していることを常に発見しました。ただし、OO階層が複雑なアプリケーションの場合は、おそらくDataMapperがより良いソリューションです。ActiveRecordはテーブルとデータオブジェクトの比率を1:1と想定していますが、そのような関係は、より複雑なドメインでは扱いにくくなります。Martin Fowlerは、彼のパターンに関する本で、モデルがかなり複雑な状況ではActiveRecordが故障する傾向があることを指摘し、DataMapperを提案していますし、代替としてをています。

これは実際には真実であることがわかりました。ドメインに多くの継承がある場合、継承をRDBMSにマッピングすることは、関連付けや構成をマッピングすることよりも困難です。

私が行う方法は、これらのDataMapper(または「サービスレイヤー」)クラスを介してコントローラーによってアクセスされる「ドメイン」オブジェクトを持つことです。これらはデータベースを直接ミラーリングするのではなく、実際のオブジェクトのOO表現として機能します。ドメインにUserクラスがあり、そのUserオブジェクトを取得するときに既にロードされている他のオブジェクトへの参照またはコレクションが必要であるとします。データはさまざまなテーブルから取得される可能性があり、ActiveRecordパターンはそれを非常に困難にする可能性があります。

コントローラーコードは、Userオブジェクトを直接読み込み、ActiveRecordスタイルのAPIを使用してデータにアクセスする代わりに、たとえばUserMapper.getUser()メソッドのAPIを呼び出すことによってUserオブジェクトを取得します。関連するオブジェクトをそれぞれのテーブルからロードし、完成したユーザー「ドメイン」オブジェクトを呼び出し元に返すのは、そのマッパーです。

基本的に、コードをより管理しやすくするために、抽象化のレイヤーをもう1つ追加するだけです。DataMapperクラスに生のカスタムSQLが含まれている場合でも、データ抽象化レイヤーAPIへの呼び出しである場合でも、ActiveRecordパターン自体にアクセスする場合でも、適切に設定されたユーザーオブジェクトを受け取っているコントローラーコードは重要ではありません。

とにかく、それが私のやり方です。


5
ActiveRecordに慣れていないように聞こえます。「ActiveRecordは、テーブル間で1:1の比率を想定しています」。まったく真実ではありません。ActiveRecordには、あらゆる種類の素晴らしいリレーショナルマジックがあります。api.rubyonrails.org/classes/ActiveRecord/Associations/…を
tybro0103

16
@JoãoBragança-おそらく皮肉なコメントではなく、自分のデータがシャーディングされたときに発生する困難を実際に説明できます-したがって、私たち全員が何かを学ぶことができます:)
Taryn East

11

人々がActiveRecordを「嫌い」になっている理由とそれが「間違っている」理由との間には、おそらく非常に異なる一連の理由があると思います。

嫌いな問題については、Railsに関連するあらゆるものに対して多くの毒があります。何が問題なのかというと、それはすべてのテクノロジーのようであり、それが良い選択である状況と、より良い選択がある状況とがあります。私の経験では、Rails ActiveRecordのほとんどの機能を利用できない状況では、データベースの構造が不適切です。データにアクセスするために必要なストアドプロシージャがたくさんある、最初の通常の形式に違反するもので、主キーなしでデータにアクセスしている場合は、単なるSQLラッパーではないものを使用したほうがよいでしょう。データベースが比較的よく構成されている場合、ActiveRecordを使用すると、それを利用できます。

コードスニペットのリジョインダーを使用して、ActiveRecordで難しいと言っているコメンターに返信するテーマに追加

@Sam McAfeeドメインにUserクラスがあり、そのUserオブジェクトを取得するときに既にロードされている他のオブジェクトの参照またはコレクションを持っている必要があるとします。データはさまざまなテーブルから取得される可能性があり、ActiveRecordパターンはそれを非常に困難にする可能性があります。

user = User.find(id, :include => ["posts", "comments"])
first_post = user.posts.first
first_comment = user.comments.first

includeオプションを使用すると、ActiveRecordでデフォルトの遅延読み込み動作を上書きできます。


8

私の長くて遅い回答、完全ではありませんが、この説明、意見、さらにはいくつかの感情が嫌いな理由についての良い説明:

1)ショートバージョン:Active Recordは、データベースとアプリケーションコードの間に「強い結合」の「薄層」を作成します。これは、論理的、何の問題も、まったく問題を解決しません。私見それはプログラマーのためのいくつかの構文糖(リレーショナルデータベースに存在するいくつかのデータにアクセスするために「オブジェクト構文」を使用するかもしれません)を除いて、いかなる値も提供しません。プログラマーに快適さをもたらす努力(IMHO ...)は、低レベルのデータベースアクセスツールに投資する必要があります。たとえば、シンプルで簡単なプレーンな類似のメソッドのバリエーション(もちろん、コンセプトとエレガンスは、使用される言語)。hash_map get_record( string id_value, string table_name, string id_column_name="id" )

2)長いバージョン:私が物事の「概念的コントロール」を持っているデータベース主導のプロジェクトでは、ARを回避し、それは良かった。私は通常、レイヤードアーキテクチャを構築します(少なくとも、中規模から大規模のプロジェクトでは、ソフトウェアをレイヤーに分割します)。

A1)データベース自体、テーブル、リレーション、DBMSで許可されている場合はいくつかのロジック(MySQLも成長しています)

A2)非常に多くの場合、データストア以上のものがあります。ファイルシステム(データベース内のブロブが常に適切な決定であるとは限らない...)、レガシーシステム(それらがアクセスされる「方法」を自分で想像してください。ポイントではありません...)

B)データベースアクセスレイヤー(このレベルでは、ツールメソッド、データベース内のデータに簡単にアクセスするためのヘルパーは大歓迎ですが、ARはここでは値を提供しません。ただし、構文上の砂糖は除きます)

C)アプリケーションオブジェクトレイヤー:「アプリケーションオブジェクト」は、データベース内のテーブルの単純な行である場合がありますが、ほとんどの場合、それらはいずれにせよ複合オブジェクトであり、いくつかのより高いロジックがアタッチされているため、このレベルのARオブジェクトに時間を費やすことはまったく役に立たない、とにかく、これらのオブジェクトの「実際の値」、「より高いロジック」をARオブジェクトの上に実装する必要があるためです。また、たとえば、「ログエントリオブジェクト」の抽象化が必要なのはなぜですか。アプリのロジックコードはそれらを書き込みますが、それを更新または削除する機能を備えている必要がありますか?ばかげて聞こえ、App::Log("I am a log message")使用するよりもはるかに簡単ですle=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();です。たとえば、アプリケーションのログビューで「ログエントリオブジェクト」を使用すると、100、1000、または10000のログ行で機能しますが、遅かれ早かれ最適化する必要があります。ほとんどの場合、アプリのロジックで小さな美しいSQL SELECTステートメントを使用し(ARアイデアを完全に壊します)、多くのコードをラップして非表示にした固定の固定されたARアイデアフレームでその小さなステートメントをラップするのではありません。ARコードの作成や構築に費やした時間は、ログエントリのリストを読み取るためのはるかに優れたインターフェイスに費やされている可能性があります(多くの場合、多くの方法で、空が限界です)。彼らの意図する用途に合わせたアプリケーション・ロジック、および実現するため愚かなパターンを再実装するのではなくます。、それは一目で良い音!

D)アプリケーションロジック-相互作用するオブジェクトのロジックを実装し、アプリケーションロジックオブジェクトの作成、削除、リスト(!)を実装します(いいえ、これらのタスクはアプリケーションロジックオブジェクト自体に固定されることはほとんどありません。あなたのオフィスの他のすべてのシートの名前と場所は?オブジェクトをリストするための「静的」メソッドを忘れてください、それはばかげています。人間の考え方を[一部ではないすべてのARフレームワークのような-] ARの考え方)

E)ユーザーインターフェイス-ええと、次の行で書くのは非常に、非常に、非常に主観的ですが、私の経験では、ARに基づいて構築されたプロジェクトはアプリケーションのUI部分を無視することがよくありました-あいまいな抽象化の作成に時間を浪費しました。結局、そのようなアプリケーションは多くのコーダーの時間を浪費し、コーダーのためのコーダーからのアプリケーションのように感じられます。コーダーは気分が良く(紙のコンセプトに従って、ハードワークは最終的に完了し、すべてが完成し、修正されています...)、そして顧客は「それがそのようである必要があることを学ぶ必要があります」、それは「プロフェッショナル」だからです。わかりました、申し訳ありませんが、私は脱線します;-)

まあ、確かに、これはすべて主観的ですが、私の経験です(Ruby on Railsを除外しました。異なる場合があり、そのアプローチでの実践的な経験はありません)。

有料プロジェクトでは、より高いレベルのアプリケーションロジックのビルディングブロックとして「アクティブレコード」オブジェクトを作成することから始める要求をよく耳にしました。私の経験では、これは非常に頻繁に顧客(ほとんどの場合、ソフトウェア開発会社)が良いコンセプト、大きな見解、最終的に製品がどうあるべきかについての概要を持っていなかったというのは、一種の言い訳でした。これらの顧客は、固定フレーム(「10年前のプロジェクトではうまくいった」)を考え、エンティティを具体化したり、エンティティの関係を定義したり、データの関係を分解したり、基本的なアプリケーションロジックを定義したりするかもしれませんが、その後停止しますそれをあなたに渡して、あなたが必要とするすべてのものであると考えてください...彼らはしばしばアプリケーションロジック、ユーザーインターフェース、使いやすさなどの完全な概念を欠いています...彼らは大きな見方を欠いており、彼らへの愛情を欠いています詳細、そして彼らはあなたにそのARのやり方に従うことを望んでいます。知りません。しかし「詳細」男性と男の子を分けるか、元の広告のスローガンはどうだった?;-)

長年(10年間の積極的な開発経験)の後、顧客が「アクティブなレコードパターン」について言及するたびに、私の警報ベルが鳴ります。私は、彼らをその重要な概念フェーズに戻すように試みることを学び、彼らに2度考えさせ、彼らの概念的な弱点を示すように試みるか、または彼らが気にならない場合は結局それらをまったく避けようとします(結局、まだ知らない顧客それが何を望んでいるかを知っている、多分それは知っているがそうではないと思っている、または無料でコンセプトワークをMEに外部化しようとする、私の時間の多くの貴重な時間、日、週、月を費やしている、ライブは短すぎる...)

だから、最後に:このすべてが私がそのばかげた「アクティブレコードパターン」を嫌う理由であり、私はそうし、可能な限りそれを避けます。

編集:私はこれをノーパターンとさえ呼びます。問題は解決しません(パターンは構文糖を作成するためのものではありません)。それは多くの問題を引き起こします:すべての問題の根本(ここで多くの答えで述べられています..)は、それが単に隠すことです古き良きよく発達し、非常に限られたパターンの定義であるインタフェースの背後に強力なSQLを。

このパターンは柔軟性を構文糖に置き換えます!

考えてみてください。ARはどの問題を解決しますか?


1
これは、データソースのアーキテクチャパターンです。おそらく、Fowler's Patterns of Enterprise Application Architectureを読むべきでしょうか?実際にパターン/ ORMを使用し、それがどれほど単純化するかを見つける前に、私はあなたと同じような考えを持っていました。
MattMcKnight、2009

1
あなたの気持ちを共有します。フレームワークが複合キーをサポートしていないと、何か臭いがします... SQLAlchemyの前に、あらゆる種類のORMを避け、SQLジェネレーターとして、それをより低いレベルで使用することがよくあります。データマッパーを実装し、非常に柔軟です。
マルコマリアーニ2010年

1
2日間私は「最先端の」ORMを使用するプロジェクトに参加しているため、おそらく実装は今成熟しています(数年前に作業していたものと比較して)。たぶん、私の心は変わるでしょう。3か月後に表示されます:-)
Frunsi

2
プロジェクトが完了し、あなたは何を知っていますか?ORMはまだ下手です。関係のある方法で「オブジェクト指向コード」の束に簡単に表現できるマッピング問題で、私は多くの時間を浪費しました。もちろん、ORMはクエリを一種のOOP + SQL-Mix(もちろんOOPに似た構文)で表現する方法を提供しましたが、それは単にSQLクエリを記述するよりも時間がかかりました。抽象化が漏れ、OOPの上にある「OOPSQLExperiment」-ユーザーがOOP構文でSQLを記述できるようにすることは、これまでで最悪の考えでした。いいえ、二度と。
Frunsi

1
私は何年にもわたってすべての生のSQLを書きました。Rails ARは私を苛立たせ、パッシブクエリについてはほぼ同意しますが、これが解決するものです。1)検証に失敗したデータを保存することが適切に困難になります。2)最後に永続化してからメモリ内で何が変更されたかを追跡します。3)ポイント2を使用before_saveしてレコード内の一貫性を維持するための適切なコールバックを作成する4)after_commit外部サービストリガーのフック。5)DDLの変更をチェンジセット(マイグレーション)に整理するための優れたDSL。(まだ苦痛はありますが、パターンがないことは、> 1の開発者の場合に悪化します。)
アダマン

6

いくつかのメッセージが私を混乱させています。いくつかの答えは「ORM」対「SQL」またはそのようなものになります。

実際のところ、ARはドメインオブジェクトを利用してデータベースアクセスコードを記述する単純化したプログラミングパターンにすぎません。

これらのオブジェクトには通常、ビジネス属性(Beanのプロパティ)といくつかの動作(通常、これらのプロパティで機能するメソッド)があります。

ARは、データベース関連のタスクに「これらのドメインオブジェクトにいくつかのメソッドを追加する」とだけ言っています。

そして、私の意見と経験から、私はそのパターンが好きではないことを言わなければなりません。

一見、それはかなり良いように聞こえるかもしれません。Spring Rooなどの一部の最新のJavaツールはこのパターンを使用しています。

私にとって、本当の問題はOOPの懸念だけです。ARパターンは、何らかの方法で、オブジェクトからインフラストラクチャオブジェクトへの依存関係を追加することを強制します。これらのインフラストラクチャオブジェクトを使用すると、ドメインオブジェクトはARによって提案された方法でデータベースにクエリを実行できます。

私はいつも、2つのレイヤーがプロジェクトの成功の鍵であると言ってきました。サービスレイヤー(ビジネスロジックが存在するか、Webサービスなどの何らかのリモートテクノロジーを介してエクスポートできる場所)およびドメインレイヤー。私の意見では、ARパターンを解決するためにドメインレイヤーオブジェクトにいくつかの依存関係(実際には必要ありません)を追加すると、ドメインオブジェクトは他のレイヤーまたは(まれに)外部アプリケーションと共有することが難しくなります。

Spring RooのARの実装は興味深いものです。ARはオブジェクト自体に依存せず、一部のAspectJファイルに依存するためです。ただし、後でRooを使用したくない場合にプロジェクトをリファクタリングする必要がある場合は、ARメソッドがドメインオブジェクトに直接実装されます。

別の視点。オブジェクトの格納にリレーショナルデータベースを使用しないと想像してください。たとえば、アプリケーションがドメインオブジェクトをNoSQLデータベースに、または単にXMLファイルに格納するとします。これらのタスクを実行するメソッドをドメインオブジェクトに実装しますか?私はそうは思いません(たとえば、XMの場合、XML関連の依存関係をドメインオブジェクトに追加します...本当に悲しいと思います)。では、Arパターンが言うように、なぜドメインオブジェクトにリレーショナルDBメソッドを実装する必要があるのでしょうか。

要約すると、ARパターンは、小さくてシンプルなアプリケーションに、よりシンプルで良い音に聞こえます。しかし、複雑で大規模なアプリがある場合は、古典的な階層化アーキテクチャの方が優れていると思います。


SOへようこそ。あなたのコメントを高く評価しましたが、この質問は11月17日11時17分17秒にNullUserExceptionによって建設的ではないためクローズされました
トニーラッド

3

問題は、Active Recordのデザインパターンについてです。ormツールではありません。

元の質問はrailsでタグ付けされており、Ruby on Railsに組み込まれているTwitterを参照しています。Rails内のActiveRecordフレームワークは、FowlerのActive Recordデザインパターンの実装です。


2

アクティブレコードに関する苦情に関して私が見た主なことは、テーブルの周りにモデルを作成し、モデルの複数のインスタンスを選択すると、基本的に「select * from ...」を実行していることです。これはレコードの編集またはレコードの表示には問題ありませんが、たとえば、データベース内のすべての連絡先の都市のリストを表示したい場合は、「...から都市を選択」して、都市のみを取得できます。 。Active Recordでこれを行うには、Cityのみを使用して、すべての列を選択する必要があります。

もちろん、実装が異なると、これは異なる方法で処理されます。それにもかかわらず、それは一つの問題です。

今、あなたはあなたがしようとしている特定のことのために新しいモデルを作成することによってこれを回避することができますが、一部の人々はそれが利益よりも努力であると主張するでしょう。

私、私はアクティブレコードを掘ります。:-)

HTH


2
「これをアクティブレコードで行うには、すべての列を選択する必要がありますが、Cityのみを使用します。」select句を指定することは実際には非常に簡単です。
MattMcKnight、2009

1

SubSonicが1列のみを行う方法が気に入っています。
どちらか

DataBaseTable.GetList(DataBaseTable.Columns.ColumnYouWant)

、または:

Query q = DataBaseTable.CreateQuery()
               .WHERE(DataBaseTable.Columns.ColumnToFilterOn,value);
q.SelectList = DataBaseTable.Columns.ColumnYouWant;
q.Load();

ただし、遅延読み込みについては、Linqが依然として重要です。


1

@BlaM:ときどき、結合の結果のアクティブレコードを実装しました。常にリレーションテーブル<->アクティブレコードである必要はありません。"結合ステートメントの結果" <->アクティブレコードでないのはなぜですか?


1

私はActive Recordをデザインパターンとして説明しますが、RORを見たことはありません。

一部の開発者はアクティブレコードを嫌っています。クリーンできちんとしたコードの記述についてのスマートブックを読んでいるためです。これらの本では、アクティブレコードは単一のレポゾビリティの原則に違反し、ドメインオブジェクトは永続的で無知でなければならないというDDDルールに違反していると述べています。 。

Active Recordの2番目のドメインオブジェクトはデータベースと1対1になる傾向があり、これはある種のシステム(主にn層)の制限と見なされる場合があります。

それは単に抽象的なことですが、Ruby on Railsがこのパターンを実際に実装するのを見たことはありません。


0

Active Recordsで見られる問題は、常に1テーブルにです。その1つのテーブルだけを実際に処理する限り、それで問題ありませんが、ほとんどの場合、データを処理するときは、どこかで何らかの結合が行われます。

はい、通常、結合はパフォーマンスに関してはまったく結合しないよりも悪いですが、結合 は通常、最初にテーブルA全体を読み取り、次に得られた情報を使用してテーブルBを読み取り、フィルタリングすることにより、「偽の」結合よりも優れています。


@BlaM:あなたは絶対的に正しいです。私はActive Recordを使用したことがありませんが、他のボルトオンされたORMシステム(特にNHibernate)を使用したことがあり、2つの大きな不満があります。オブジェクト(つまり、それぞれが独自のアセンブリにコンパイルされた)、オブジェクトをロードするだけでパフォーマンスヒットが発生しました(NHibernateは、同等のSQLクエリがほとんど処理を行わない場合、何もロードしないクエリを実行して数秒間シングルコアプロシージャをスパイクする可能性があります)。もちろん、Active Recordに固有ではありませんが、ほとんどのORMシステム(およびORMのようなシステム)は次のように見えます
TheSmurf 2008

hbm.xmlファイルを使用する代わりに多くの方法があります。たとえば、NHibernate.Mapping.Attributesおよびfluent-nhibernateを参照してください。
Mauricio Scheffer、

オブジェクト作成のパフォーマンスについては、私はそのようなパフォーマンスの問題に遭遇したことがありません。プロファイラーで確認したいと思うかもしれません。
Mauricio Scheffer、

@mausch:プロファイラーは必要ありません。これはかなりよく知られた問題です。それが最新バージョン(私はまだ仕事で使用していません)に適用されるかどうかわかりません。 ayende.com/Blog/archive/2007/10/26/...
TheSmurf

4
検索でIE:Customers.find(:all、:include =>:contacts、:conditions => "active = 1")に:joinsまたは:includesを使用すると、SQL結合が行われ、テーブルの全スキャンは行われません。
Tilendor、2009

0

ActiveRecordの問題は、自動的に生成されるクエリがパフォーマンスの問題を引き起こす可能性があることです。

クエリを最適化するためにいくつかの直感的でないトリックを実行することになりますが、そもそもクエリを手動で作成するほうが時間的により効果的だったのではないかと疑問に思います。


0

SQL最適化に関する他のすべてのコメントは確かに有効ですが、アクティブなレコードパターンに関する私の主な不満は、通常、インピーダンスの不一致につながるということです。私はドメインをクリーンに保ち、適切にカプセル化するのが好きです。アクティブレコードパターンは通常、実行するすべての希望を破壊します。


ActiveRecordは実際に、リレーショナルスキーマに対してオブジェクト指向の方法でコーディングできるようにすることで、インピーダンスの不一致の問題を解決します。
Mauricio Scheffer、

詳しく説明しますか?一般的なコンセンサスは、リレーショナルデータベースをモデルにしたオブジェクトは、定義上、オブジェクト指向ではないということです(リレーショナルデータベースは、継承やポリモーフィズムなどのOOの概念を中心に展開していないため)。
Kevin Pang

継承をリレーショナルスキーマにマッピングする方法は3つ知られています。参照:castleproject.org/ActiveRecord/documentation/trunk/usersguide/…–
Mauricio Scheffer、

Castle Active Record OSSプロジェクトをActive Recordの設計パターンと間違えていると思います。元の質問(および私の回答)は、デザインパターンに関するものです。Castle Active Recordプロジェクトには、OO開発を支援するための機能が組み込まれていますが、パターン自体にはありません。
Kevin Pang

参考までにお城を引用しただけです。RoRののActiveRecordのは、単一テーブル継承のみ(実装martinfowler.com/eaaCatalog/singleTableInheritance.htmlを()が、他の戦略が検討されているblog.zerosum.org/2007/2/16/...
マウリシオ・シェファー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.