Rails has_many:通过关联访问链接记录值

时间:2016-12-06 18:31:59

标签: ruby-on-rails ruby associations ruby-on-rails-5

我有两个模型通过第三个通过多对多关联链接。模型如下:

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

因为我认为这会降低性能,使请求更长。

我的问题是:如果可能的话,如何通过关联访问将此卡链接到此标记的记录的属性?

提前感谢您的帮助。

3 个答案:

答案 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

我是在思考它!