【发布时间】:2019-07-26 04:41:12
【问题描述】:
更新:
如何将虚拟属性添加到模型并保留活动记录关系。
我尝试了以下方法,但 .each 返回一个数组,而不是活动记录。我还可以使用什么其他方法?
我的set_listable_for 方法是将活动记录关系转换为数组。我想保留 ActiveRecord 关系。
在运行时,我向活动记录模型添加了 attr_access。
def add_listable_attribute_to(*relation)
relation.each do |rel|
rel[1].first.class.class_eval do
attr_accessor :listable
end
end
end
然后我用这个方法将属性的值设置为所有记录的相同值....
def set_listable_for(relation, object)
relation.each do |record|
record.listable = object
end
end
但是,我的 ActiveRecord 关系被转换为 Array afterwords。
如何保留 Active Record 关系,因为我不需要数组。由于我在这里继续使用它并继续对其进行范围和查询......
def union_scope(*relation)
add_listable_attribute_to(*relation)
listable = relation.first[0]
combined = set_listable_for(relation.first[1], listable)
relation.drop(1).each do |relation_set|
listable = relation[0]
set_listable_for(relation_set[1], listable)
combined = combined.or(relation_set[1])
end
combined
end
谢谢
【问题讨论】:
-
这正是
ActiveRecord::Relation的行为方式。它表示可以针对数据库运行的范围或查询(尚未包含记录)。一旦您需要一个或多个实际记录,它就会加载记录并将它们返回到一个数组中。如果您在关系上调用first、count或each之类的方法,则会发生这种情况。因此,我不清楚您的问题,因为您要求禁用其核心功能。 -
@spickermann,我正在寻找一种替代解决方案,它可以替换我的代码,这样我就可以返回一个 AR 关系,而不是数组。
标签: ruby-on-rails ruby activerecord ruby-on-rails-5.2