考虑我的域模型的以下简化表示.

class Item < ApplicationRecord
  has_many :tags
end

class Tag < ApplicationRecord
  belongs_to :item
  enum :value, %i{hot cold}

  validates :value, uniqueness: { scope: :item_id }
end

每个项目都有零个或多个标签,这些标签指示可能与我的程序相关的项目的属性.在本例中,"热"和"冷"是唯一有效的标记.

如果我想找到所有被标记为"热门"的物品,我可以写

Item.joins(:tags).where('tags.value = 0')

自然,我更喜欢写单词"hot",而不是枚举的整数值.我可以通过命名参数强制ActiveRecord使用.

Item.joins(:tags).where('tags.value': 'hot')

但是,拥有一个名称不是有效Ruby标识符的命名参数感觉有点...不对.有没有一种更好的方法来进行这个查询,而不涉及这样一个奇怪的伪变量?

推荐答案

这感觉好点了吗:

Item.joins(:tags).where(tags: {value: :hot})

class Item < ApplicationRec或d
  has_many :tags

  scope :tagged, ->(value) { joins(:tags).where(tags: {value:}) }
end

Item.tagged(:hot)

Ruby-on-rails相关问答推荐

如何测试自定义路由?

在PDF生成中渲染 colored颜色

使用ImportMaps将HighLightJS添加到rails 7.1

Sweet Alert 2 在 Rails 7 应用程序中无法正常工作

多行与内联块之间的不同行为

Ruby 3 动态关键字参数

来自控制台的 ActionCable.server.broadcast

Rails Migration将字符串转换为整数?

Rails:如何访问 RESTful 助手?

rails 方法获取模型的关联名称

如何按值按降序对哈希进行排序并在 ruby​​ 中输出哈希?

带有 master.key 的 Rails 5.2 - Heroku 部署

未选中时,如何使 check_box_tag 发布false或0参数?

Rails:立即渲染并退出

Rails 5:重命名表迁移

减go Ruby 中的日期并以分钟为单位得到差异

为什么 Ruby on Rails 使用 http://0.0.0.0:3000 而不是 http://localhost:3000?

has_many :通过 class_name 和 foreign_key

在rails国际化yml文件中传递变量

Rails 在 id 字段上重置种子的方法