0

次のサンプルコードについて考えてみます。

def Product < ActiveRecord::Base
end

def Book < Product
end

(この種の関係の名前を見つけるのをあきらめました。Bookは「子モデル」、Productは「親」だと思いましたが、それは正しくありません。たとえば、別のCommentモデルオブジェクトにリンクされたCommentモデルオブジェクトは何ですか。上記のコードでモデルの関係を説明するためのより良い方法がある場合は、ここに書き留めておいてください。いずれにしても、これが私がここにいる理由ではありません。 。)

もちろん、上記のコードを使用すると、BookモデルはProduct「products」と同じデータベーステーブルを共有します。モデルタイプは、テーブルの「タイプ」列に文字列として保存されます。したがって、Product.createを呼び出すと、タイプ値が「Product」に設定された行がテーブルに挿入され、Book.createで使用すると同じようになりますが、値は「Book」になります。

ただし、Book.lastを呼び出すと、予想どおり「Book」タイプの最後の行が返されますが、Product.lastは、「Product」や「Book」などのタイプに関係なく、最後の行を返します。 「最後の「商品」だけを手に入れたいのに。

Bookでオーバーライドするdefault_scopeをProductで定義しようとしましたが、それが解決するよりも多くの問題を引き起こし、Bookに継承されているProductの名前付きスコープを台無しにしました。

Product.lastが「Product」タイプの最後のオブジェクトを返し、「Book」タイプのオブジェクトを回避する方法はありますか?

よろしくお願いします。

4

2 に答える 2

0

すべてがテーブル内の「Product」であるため、Product.lastが最後の行を返す必要があることは明らかです。やりたいのは特定のタイプ「Product」を検索することですが、テーブルは実際にはProductのタイプを設定していないため、nilのままにします。

したがって、これは実際に機能すると思います。

Product.find_last_by_type(nil)

試してみませんか?別のテーブルでテストしましたが、これでうまくいくと思います。

于 2011-06-29T02:07:06.407 に答える
0

ここでの基本的な誤解は、「関係」または「関連付け」(「has_one」、「belongs_to」など)の概念と、オブジェクト指向の継承の概念の間にあるようです。

これについて読んでください:http: //rubylearning.com/satishtalim/ruby_inheritance.html

あなたの例に基づいて、あなたは関連の概念を理解していると思いますが、あなたはそれを継承と混同しています。それは同じではなく、あなたはここで完全に理解していません。

クラスが別のクラスから継承する場合(この例では、BookはProductから継承します)、「子」クラスは「親」クラスのすべての機能に加えて、その上に追加される新しい機能を取得します。

そのため、すべての本が製品ですが、すべての製品が本であるとは限りません。

Product.lastがタイプに関係なくproductsテーブルの最後の行を返す理由は、すべてのProducts(Booksを含む)がproductであるためです。したがって、本は製品であるため、最後の製品が本である場合は、それが返されます。


さて、ここでやろうとしていることを達成する最も簡単な方法は、すべてのタイプの製品を製品のサブタイプとして定義し、Product.lastを使用しないことです。

本、CD、車を追跡しているとしましょう

クラスブック<製品クラスCD<製品クラス車<製品

このように、最新のBook、CD、またはCarをデータベースに追加する必要がある場合は、Book.last、CD.last、またはCar.lastを実行します。任意のタイプの最新の製品を知る必要がある場合は、Product.lastを実行します。

于 2011-06-29T03:03:05.017 に答える