ruby - 使用嵌套属性的 where 条件访问子级
问题描述
我有以下关系集,仪表板过滤器值有一个名为 filter_type 的列,它的值可以是 1 或 0。
class DashboardFilterValue < ApplicationRecord
belongs_to :dashboard_filter
end
class DashboardFilter < ApplicationRecord
has_many :dashboard_filter_values, dependent: :destroy
accepts_nested_attributes_for :dashboard_filter_values
before_save :check_parameter_length
def check_parameter_length
Rails.logger.info self.dashboard_filter_values.inspect #prints the ActiveRecord::Associations::CollectionProxy
Rails.logger.info self.dashboard_filter_values.where(:filter_type => 0) #does not print anything
end
end
在before_save
回调中,当我使用self.dashboard_filter_values.inspect
时,会打印
ActiveRecord::Associations::CollectionProxy
.
但self.dashboard_filter_values.where(:filter_type => 0)
不打印任何东西,即使有满足条件的记录。
在before_save
回调中,如何使用 where 条件过滤我想要的值。
在这方面的任何帮助都会非常棒。谢谢。
解决方案
我相信这是行不通的,因为采取了before_save
行动。当您使用where
它时,它正在执行数据库查询,但是因为您在保存之前查询数据库,所以没有返回任何内容。
我会说你有两个选择:
- 将其转换为
after_save
- 改用
Enumerable#select
:
Rails.logger.info self.dashboard_filter_values.select { |filter| filter.filter_type == 1 }
推荐阅读
- javascript - 警报消息框自行处理而不是单击“确定”按钮
- postgresql - 在 Postgres 中根据另一个表过滤一个表
- javascript - 从控制器调用方法到猫鼬模式文件(Nodejs)
- javascript - 检测鼠标在图像上的位置
- xml - 如何删除从顶部节点向下 2 级的子节点
- python - 如何根据索引然后根据条件选择数据框的行?
- laravel - 允许在 htmlentities 中使用特定的 HTML 标记
- windows - 您可以从特定文件启动 wget 吗?
- sql - 如何计算仅附加行的运行总和
- xml - 从 XmlDocument 对象中删除所有命名空间的最简单方法