0

助けてください。

自己参照モデルがあり、スコープが設定されている非主キーを外部キーが参照するようにしたい。

リストテーブルには、リストセット内でのみ一意であるリストの増分IDを含むsequence_id列があります。同じsequence_idが、別のリストセットのリストに表示されることを意味します。ただし、このsequence_idはテーブル全体で一意ではないため、主キーにはしませんでした。

この非主キーを使用して自己参照関係を実現するにはどうすればよいですか?

どうもありがとうございます。

モデル:

 Class Listset
       has_many :lists, :dependent => :delete_all
       has_many :items, :through => :lists
    end

    Class List
       belongs_to :listset

       belongs_to :parentList, :class_name => "List"
       has_many :childList, :class_name => "List", foreign_key => "parent"

       has_many :items, :dependent => :delete_all
    end

    Class item
        belongs_to :list
    end
4

2 に答える 2

0

私があなたを正しく理解していれば、主キーを使用して自己参照関係をモデル化する方法をすでに知っています。それぞれにListparent_id他のいくつかListsid(主キーである)を参照するがあります。sequence_idあなたが求めているのは、デフォルトの主キーの代わりに非主キーを使用して自己参照関係をモデル化できるかどうかだと思いますid

概念的には、これが可能なのは、モデル内の各レコードがそのそののList両方によって一意に識別されるためです。その理由は、のスコープ内で一意であるためです。sequence_id listset_idsequence_idlistset_id

ただし、この方法で'の親belongs_toを見つけるために安全に操作できるとは思いません。railsguidesListによると、

... 1つのモデルが別のモデルに属することを宣言することにより、2つのモデルのインスタンス間で主キー-外部キー情報を維持するようにRailsに指示します。

つまりbelongs_to、主キーである外部キーを使用してレコードを検索することを期待します。スコープにbelongs_to基づいて、次のようなものを使用して親を識別させることを試みることができますがlistset_idsequence_id

belongs_to :parent_list, foreign_key: :parent_id, class_name: "List", conditions: proc { {:listset_id => listset_id, :sequence_id => parent_id} }

belongs_to関連するモデルを識別するために主キーを使用することを期待しているため、これは予期しない動作につながる可能性があります。

しかし、これがあなたが望んでいたことであるかどうかは完全にはわかりません。教えて。

于 2012-10-16T08:12:58.233 に答える
0

について質問していることを明確にできますsequence_idか?

これは、自己参照関係に役立つはずです。

class List < ActiveRecord::Base
  belongs_to :listset
  belongs_to :parent,      :class_name => "List"
  has_many   :child_lists, :class_name => "List", :foreign_key => "parent_id"
  # etc...
end

parent_idこれは、データベース テーブルに列があることを前提としています。

Rails の慣例では、名前付きリレーションにアンダースコアを付けます。つまり:child_lists:childList.

ActiveRecord への指示を使用して、リレーションシップで参照される外部キーであるリスト テーブル内belongs_to :parentの列を探します。parent_idhas_many

于 2012-10-16T07:04:47.393 に答える