2016-08-17 4 views
0

私は書籍や記事などをレビューするアプリを作っています。多くの既存モデルを1つの新しいモデルにリンクします。 Ruby on Rails

私は、作品(本や記事)、セクション(自己説明)、サブセクション、サブセクションのモデル、ビュー、コントローラなどを作成して、アプリケーションのバックボーンを作成しました。

新しいモデルを「リンク」モデル(別のソースまたはウェブサイトへのリンクになる)に追加したいと考えています。私の問題は、私が前に述べたすべてのモデルに "リンク"を付ける方法を知らないことです。私は上記のモデルのそれぞれに "リンク"へのアクセスとCRUD機能を持たせたいと思っていますが、これまでに読んだのはhas_manyかhas_and_belongs_to_manyです。

私が理解する限り、これらの種類の関係は、1つのモデルを1つの他のモデルに関連付けるだけです.Pieceには多くのセクションがありますが、これらの2つのモデルのみが関連します。

私はリンクモデルが義務piece_idを持っていなければならないだろうと思いますが、その後の任意のIDのような:SECTION_IDは、リンクがあった場所に応じてsubsection_id。だから私の最初の本の第3章でリンクを追加したいのであれば、それは必須のpiece_id = 1とsection_id = 3を持ちますが、subsection_idまたはsubsubsection_idはありません。

それで、モデルをいくつかの他のモデルに属するように作成するにはどうすればいいですか?それともこれも可能ですか?

https://github.com/kingdavidek/StuddyBuddy

+1

他のモデルの1つに属することができますか?または、すぐにそれらの多くに属していますか? –

+0

アイデアは、それが1つに属すると考えていますが、どれが1つに属しているかによって、多くの人に属することができます。 ** Piece >> Section >> Subsection >> Subsubsection **の間にネストされた関係がありますので、** Subsection **に新しい** Link **を作成したい場合、** Subsection **に属しますまた、**セクション**と**ピース**のネストされた関係のために。 – Kingdavidek

+0

あなたは関係を通してhas_manyを使用できます。このリンクを確認してください http://stackoverflow.com/questions/31358679/is-a-has-many-through-relationship-possible-with-4-models-in-rails – abhi110892

答えて

0

これはpolymorphic団体のためのかなり良いユースケースです。ここで

class Link < ActiveRecord::Base 
    belongs_to :linkable, polymorphic: true 
end 

class Piece < ActiveRecord::Base 
    has_many :links, as: :linkable 
end 

class Section < ActiveRecord::Base 
    has_many :links, as: :linkable 
end 

links表はlinkable_id(int型)とlinkable_type(文字列)の列があります。簡単にするために、多くの関係1から始めることができます。ここでの注意事項を取るための一つの重要なことはlinkable_idは、ビューのRBDMS点から真の外部キーではないということです。むしろActiveRecordは関係をロードするときに関係がどのテーブルを指すかを解決します。

、我々は必要な動作を含むモジュールを作成することができ、重複を削減したい場合。 ActiveSupport::Concernを使用すると、そのようなモジュールの作成に関わる定型コードが大幅に削減されます。

class Link < ActiveRecord::Base 
    belongs_to :linkable, polymorphic: true 
end 

# app/models/concerns/linkable.rb 
module Linkable 
    extend ActiveSupport::Concern 

    included do 
    has_many :links, as: :linkable 
    end 
end 

class Piece < ActiveRecord::Base 
    include Linkable 
end 

class Section < ActiveRecord::Base 
    include Linkable 
end 

どのように多対多の関係を作りますか?

サイドノートで
class Link < ActiveRecord::Base 
    has_many :linkings 
end 

# this is the join model which contains the associations between 
# Links and the "linkable" models 
class Linking < ActiveRecord::Base 
    belongs_to :link 
    belongs_to :linkable, polymorphic: true 
end 

# app/models/concerns/linkable.rb 
module Linkable 
    extend ActiveSupport::Concern 

    included do 
    has_many :links, through: :linkings, as: :linkable 
    end 
end 

class Piece < ActiveRecord::Base 
    include Linkable 
end 

class Section < ActiveRecord::Base 
    include Linkable 
end 

- セクション間の階層構造を構築するための良い方法は、単一のセクションモデルとgive it a self joining relationshipを使用することです。

class Section < ActiveRecord::Base 
    belongs_to :parent, class_name: 'Section' 
    has_many :children, class_name: 'Section', 
         foreign_key: 'parent_id' 
end 
+0

あなたの答えはありがとうございます。これはまさに私が必要としているようですが、しかし、私はそれを試して理解するために専門用語などを調べます。自己結合関係については、ネストされたモデルのPiece >> Section >> Subsectionなどを参照していますか?あなたは本質的にSection >> Section >> Section >> Ad infinitumに行くことができるようにしますか? – Kingdavidek

+0

"あなたは本質的にセクション>>セクション>>セクション>>広告無限に行くことができるようにあなたの方法を作ってくれるでしょうか? - はい、正確に。かなり高度なものであるため、レール[ガイドの関連付けに関する記事](http://guides.rubyonrails.org/association_basics.html#self-joins)を上から下に読むことをお勧めします。 – max

1

[OK]を、本質的にあなたがpolymorphic association

class Link 
    belongs_to :linkable, polymorphic: true 
end 

class Piece 
    has_many :links, as: :linkable 
end 

リンクlinkable_id整数列とlinkable_type文字列が必要になりたいように、それが聞こえます。私は款において新しいリンクを作成したい場合は、その後、通常のhas_manybelongs_toに関連

と同じようにそれを使用することができ、それはだけでなく、理由の節やワンピースに、 サブセクションに属します 関係

このビットレールは役に立ちません。アイテムのチェーン内のすべてのリンクを見つける独自のメソッドを作成する必要があります。

+0

あなたの助けていただきありがとうございます。入れ子にされた関係でサブセクションにリンクさせるのは難しく、ツリーの上に親IDがあるだけであると思いますか? – Kingdavidek

+0

@Kingdavidekクロージャーツリーや祖先のような木構造のルビーの宝石を見ると、それらの多くはこの機能入力を持っています –

関連する問題