1. ホーム
  2. ruby-on-rails

[解決済み] なぜActive Recordは嫌われるのか?[クローズド]

2023-01-09 23:57:43

質問

私がOOPについて学び、さまざまなデザインパターンを実装するようになると、私は、人々が アクティブレコード .

しばしば、人々はそれがうまくスケールしないと言います(Twitterをその典型例として挙げています)--しかし、誰も実際には なぜ ARの長所を短所なく実現する方法(似ているが異なるパターンを介して?)

これがデザインパターンについての聖戦にならないことを祈ります。私が知りたいのは、***具体的に*** Active Recordの何が問題なのか、ということだけです。

うまくスケールしないのであれば、なぜしないのですか?

他にどんな問題があるのですか?

どのように解決するのですか?

そこに ActiveRecordのデザインパターン RailsのORMライブラリであるActiveRecord そして、.NETや他の言語用の模造品もたくさんあります。

これらはすべて異なるものです。ですから、「ActiveRecordは最悪だ」と言う前に、「どのActiveRecordなのか、たくさんあるじゃないか」と言う必要があるのです。

私はRailsのActiveRecordしか知らないので、それを使っている文脈で提起されたすべての不満に対処してみようと思います。

ブラマヨ

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 という SQL を生成し、関連する Company オブジェクトを自動的に生成します。 people.first.company を行うことができ、データはすでに存在しているので、データベースをヒットする必要はありません。

@pix0r

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

コードです。

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

これは醜いのでお勧めしませんが、ただ単純に生のSQLを書く必要がある場合には、簡単に行えます。

ティム・サリバン(Tim Sullivan

...そして、モデルの複数のインスタンスを選択する場合、基本的に "select * from ..." を行っていることになります。

コードです。

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

これはデータベースから名前とIDのカラムを選択するだけで、マッピングされたオブジェクトの他のすべての「属性」は、手動でそのオブジェクトをリロードしない限り、単にnilになるだけです。