【发布时间】:2016-04-29 13:51:13
【问题描述】:
我有一个简单的 ActiveRecord 查询:
similar_changes = Notification.where(change_owner: 'foo1', change_target: 'foo2', change_cancelled: false)
每个通知对象都有一个字段change_type,我还有另一个函数可以检查一个通知的change_type 和另一个通知的反向更改(在我的应用程序上下文中相互撤消的更改)。
我需要获取此通知的change_type 并将其与数组中的所有其他人进行比较。我必须像这样引用对象:similar_changes[0]['change_type'] 其中第一个索引是数组中的每个 ActiveRecord,第二个索引是指定 Notification 对象中的哪个属性的字典。
我觉得我可以使用两个嵌套循环和 if 语句手动执行此操作,但我也了解 Ruby,我觉得这是它应该内置的东西。
我错了,还是有更好的方法来做到这一点?
这是代码(请注意,所有这些代码都还没有完成,如果不完美,请耐心等待):
def self.group_similar_changes(owner, target, change_type)
# long query where it selects all rows where change_owner and change_target
# are the same as original
# also where cancelled is false
# determine if cancelled (yaml)
# if cancelled (do nothing)
similar_changes = Notification.where(
change_owner: owner,
change_target: target,
change_cancelled: false
)
similar_changes.each do |change|
cancel_inverse_change(change, change.change_type)
if change.cancelled?
similar_changes.delete(change)
end
end
end
end
def cancel_inverse_change(change, change_type)
if change.inverse?(change_type)
change.cancel
end
end
def inverse?(possible_inverse_change)
is_inverse = false
change_types = YAML.load_file(File.join(NotificationManager::Engine.root, 'config/change_types.yaml'))
if self.change_type == change_types[possible_inverse_change]['inverse']
is_inverse = true
end
return is_inverse
end
【问题讨论】:
-
不,没有 Ruby 魔法可以做到这一点。使用循环。
-
“return inverse”中的“inverse”从何而来?还有 change_types 与 change_type
-
啊,对不起。打错字了,抱歉。
-
不需要赋值给is_inverse然后返回。只需返回 self.change == change_type[possible_inverse_change][1]['inverse'] (我假设 change_type 与 change_types 也是一个错字?)
-
不相关,但您可能希望通过将除 YAML 加载之外的每一行替换为
return self.change == change_type[possible_inverse_change][1]['inverse']来清理此方法
标签: ruby-on-rails arrays ruby rails-activerecord