How to format fields in a table for has_many :through association?
我有两个模型 -
有用户。有图像。我希望用户能够为自己添加图像。为此,文档中清楚地描述了所有内容。
我做到了。有了这个,一切都很好。
但问题是我需要在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class UsersAndImage < ApplicationRecord enum status: { pending: 0, active: 1, # ... } belongs_to :user belongs_to :image validates :user, presence: true validates :image, presence: true # ... end |
然后我不明白如何进一步描述
与表的关系描述如下:
1 2 3 4 5 6 | class User < ApplicationRecord # ... has_many :users_and_images has_many :images, through: :users_and_images # ... end |
我需要重写这个关系,以便从链接表中按状态过滤。也就是说,例如,这个代码:
1 2 | user = User.find(1) user.images |
仅显示状态为"活动"的图像。
请告诉我,我该如何实现?
现在我只看到一种方法 - 这是直接使用
1 2 | user = User.find(1) user.users_and_images.some_scope_with_where.map(&:image) |
但在我看来,这是错误的方式。
也许我需要做这样的事情?
1 2 3 4 5 6 | class User < ApplicationRecord # ... has_many :users_and_images, -> { where(status: UsersAndImage.statuses[:active]) } has_many :images, through: :users_and_images # ... end |
而在这种情况下,状态的变化应该直接在
你怎么看?
您可以将一个块添加到
1 2 3 4 5 6 7 8 9 10 | 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 |
您可以通过
获取其他状态