我有两个模型通过第三个通过多对多关联链接。模型如下:
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 partial中生成类似的内容:
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
因为我认为这会降低性能,使请求更长。
我的问题是:如果可能的话,如何通过关联访问将此卡链接到此标记的记录的属性?
提前感谢您的帮助。
答案 0 :(得分: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
includes(:tag)将在一个请求中获取所有标记,因此不会影响性能。
答案 1 :(得分:1)
您可以使用已经为热切加载回答的includes
方法,因此,如果您通过关系访问任何属性而不对db执行其他请求。此外,您可以在模型上使用delegate
。例如,在您的模型卡上:
delegate :attribute_name, to: :tagging, prefix: :tagging
这样,您可以在card_object上访问您的属性:
card_object.tagging_attribute_name
前缀是可选的,以避免模糊属性名称。 希望这有帮助!
答案 2 :(得分:0)
我找到了解决问题的简单方法:
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
我是在思考它!