2016-12-06 15 views
0

2つのモデルが多対多の関連付けで3つ目のリンクを介してリンクされています。モデルは次のとおりです。Rails has_many:レコードをリンクするアソシエーションアクセス

class Tag < ApplicationRecord 
has_many :taggings 
has_many :cards, through: :taggings, inverse_of: :tags 
end 

class Card < ApplicationRecord 
has_many :taggings 
has_many :tags, through: :taggings, inverse_of: :cards 
end 

class Tagging < ApplicationRecord 
    belongs_to :card 
    belongs_to :tag 
end 

私は部分的に私_card.json.jbuilderでそのような何かを生成する必要があります:

json.tags(card.tags) do |t| 
    json.id t.id 
    json.name t.name 
    json.tagging_id ? 
    json.tagging_created_at ? 
end 

私は

json.tagging_id = Tagging.find_by(card_id: card.id, tag_id: t.id).id 
のように別の要求を使用したくありません

これは、パフォーマンスが低下してリクエストが長くなると想定しているためです。

私の質問は、可能であれば、このカードとこのタグを関​​連付けてリンクしているレコードの属性にアクセスする方法ですか?

ご協力いただきありがとうございます。

答えて

1

あなたはすでに熱心な負荷のために既に回答しているようにincludesメソッドを使用することができます。また、モデルにdelegateを使用することができます。だから、例えば、あなたのモデルのカード上:

delegate :attribute_name, to: :tagging, prefix: :tagging 

この方法で、あなたがcard_objectであなたの属性にアクセスすることができます

card_object.tagging_attribute_name 

プレフィックスはあいまいな属性名を避けるために、任意です。 これが役立つことを願っています!

+0

あなたの答えをありがとう、それは良い解決策です。しかし、私の問題は思ったよりも簡単だったことに気がつき、簡単な方法で解決しました(http://stackoverflow.com/a/41003180/6245540参照)。あなたも私の問題を解決してしまったので、他の人が私の代わりにもっと普遍的なものを見るように受け入れます:) –

1

実際にカードのすべてのタグ付けペアをjsonで表示したいですか?

は多分それは助けることができる:

json.tags(card.taggings.includes(:tag)) do |t| 
    json.id t.tag_id 
    json.name t.tag.name 
    json.tagging_id t.id 
    json.tagging_created_at t.created_at 
end 

は、(:タグ)を、それがパフォーマンスに影響を与えないように、一つのリクエストに含まれるすべてのタグを取得します。

+0

あなたの答え(偉大でしたが、私のニーズをうまく表現していませんでした)を見ると、解決策が見つかりました。私は数分で投稿します。ご協力ありがとうございました ! –

0

私は私の問題に非常に簡単な解決策が見つかりました:私はそれをoverthinkingた

json.tags(card.taggings) do |t| 
    json.id t.tag.id 
    json.name t.tag.name 
    json.tagging_id t.id 
    json.tagging_created_at t.created_at 
end 

を!