2016-11-29 7 views
0

私はかなり新しいレールですが、いくつかのモデル関係に問題があります。リレーションシップモデル

私は、これらのテーブル

+--------------+-----------------+------+ 
| Artists  | Artist Features | Tags | 
+--------------+-----------------+------+ 
| ID   | ID    | ID | 
| Name   | artist_id  | name | 
| Address  | price   |  | 
| Country  | tag_id   |  | 
| Email  |     |  | 
+--------------+-----------------+------+ 

は、私がアーティストとアーティストの特長 artistshas_manyartist_featuresartist_featureshas_manyタグの間の関係を持っています。私は、クエリで私はartistsと対応するartist_featuresを取得するには、以下の使用してきましたが、あまりにもタグを取得したいと思い、すべてのアーティスト、上記の構造に基づいて機能やタグ、artist_idtag_id

を取得したいですベース上tag_id

@Artists = Artist.all.artist_features 
+1

アーティストの機能has_many'タグの場合、 'artist_features'テーブルの' tag_id'カラムではなく、 'tags'テーブルの' artist_feature_id'カラムを持つべきです。 –

答えて

1

has_manyタグアーティストフィーチャーした場合は、この関係の構造に合わせて、テーブルの列を変更する必要があります。

/belongs_toリレーションシップでは、常にbelongs_toメソッド呼び出しのモデルには外部キー列が必要です。

この場合、タグのセットを用意して、アーティスト機能でこれらのタグを参照できるようにしたいとします。これは、ArtistFeatureTagと呼ばれるArtistFeatureTagの間に別のモデルを追加してテーブルartist_feature_tagsを追加することで可能です。

あなたのモデル構造は次のようになります。

アーティスト:idnameaddresscountryemail

class Artist 
    has_many :artist_features 
end 

アーティスト特集:idartist_idprice

class ArtistFeature 
    belongs_to :artist 
    has_many :artist_feature_tags 
    has_many :tags, through: :artist_feature_tags 
end 

Ar tistFeatureTag:idartist_feature_idtag_id

class ArtistFeatureTag 
    belongs_to :artist_feature 
    belongs_to :tag 
end 

タグ:idartist_feature_id、余分なテーブルが直感的に見えるかもしれませんが、それは、アーティストの機能やタグ、すなわち複数の関係を記憶しておく必要がありますname

class Tag 
    has_many :artist_feature_tags 
    has_many :artist_features, through: :artist_feature_tags 
end 

アーティスト機能は同じタグを参照する場合があり、これらの参照はArtistFeatureTagの形式をとります。

これは基本的にhas and belongs to many-type relationshipであることに注意してください。しかし、関係を明示的に作成することに決めました。

+0

ありがとうChris、私のタグテーブル私は同じタグ名を持つ行を複製したくありません。だから、私のタグにartist_feature_idを持つことは、そのシナリオではうまくいかないでしょうか?おそらく私の構造はあまり明確ではありません! – Adam

+0

私は、私の答えを更新することを確認します。 –

+0

クリスおかげさまで大変感謝しています!これは私が必要とするものです。 – Adam

関連する問題