如何为表has_many:through关联设置格式?

我有两个模型-UserImage。我还有第三个模型-UsersAndImage

有用户。有图像。我希望用户能够向自己添加图像。为此,documentation中清楚地描述了所有内容。

我做到了。这样,一切都很好。

但是问题是我需要向users_and_images表添加状态:

class UsersAndImage < ApplicationRecord
  enum status: {
    pending: 0,active: 1,# ...
  }

  belongs_to :user
  belongs_to :image

  validates :user,presence: true
  validates :image,presence: true

  # ...
end

在那之后,我不明白如何在User模型中进一步描述连接。也就是说,我需要使用状态。

与表的关系描述如下:

class User < ApplicationRecord
    # ...
    has_many :users_and_images
    has_many :images,through: :users_and_images
    # ...
end

我需要重写此关系,以便从链接表中按状态进行过滤。例如,该代码为:

user = User.find(1)
user.images

仅显示状态为“有效”的图像。

请告诉我,我该如何实现?

现在我只看到一种方法-这是直接与UsersAndImage模型一起工作(类似这样):

user = User.find(1)
user.users_and_images.some_scope_with_where.map(&:image)

但是在我看来,这是错误的方法。

也许我需要做这样的事情?

class User < ApplicationRecord
    # ...
    has_many :users_and_images,-> { where(status: UsersAndImage.statuses[:active]) }
    has_many :images,through: :users_and_images
    # ...
end

在这种情况下,状态更改应直接在users_and_images表中。但是获取“过滤后的” images将照常进行。然后如何使用枚举助手?毕竟,我想将它们用于images,而不是users_and_images。如果我想获取所有图像怎么办?

你怎么看?

mintz2004 回答:如何为表has_many:through关联设置格式?

您可以在has_many块中添加一个块。 this question有一个很好的答案。我会帮助您以干燥的方式在UsersAndImage中添加这些状态方法。

class User < ApplicationRecord
  has_many : users_and_images
  has_many :images,through: : users_and_images do 
    UsersAndImage.statuses.each do |method_name,value|
      define_method(method_name) do 
        where("users_and_images.status = ?",value)
      end
    end
  end
end

您可以通过user.images获取所有图像,通过user.images.active获取活动图像,通过user.images.pending获取待处理图像,并通过user.images.[other status]获取其他状态

本文链接:https://www.f2er.com/3124260.html

大家都在问