lib/active_record/associations.rb
您可以在第 1295 行的文件中找到源代码
def collection_accessor_methods(reflection, association_proxy_class, writer = true)
collection_reader_method(reflection, association_proxy_class)
if writer
define_method("#{reflection.name}=") do |new_value|
# Loads proxy class instance (defined in collection_reader_method) if not already loaded
association = send(reflection.name)
association.replace(new_value)
association
end
define_method("#{reflection.name.to_s.singularize}_ids=") do |new_value|
ids = (new_value || []).reject { |nid| nid.blank? }
send("#{reflection.name}=", reflection.class_name.constantize.find(ids))
end
end
end
你绝对应该避免覆盖这种方法来添加魔法东西。Rails 有时已经“太神奇了”。我建议使用您的所有自定义逻辑创建一个虚拟属性,原因如下:
- 其他一些 rails 方法可能依赖于默认实现
- 您依赖的特定 API 可能会在未来的 ActiveRecord 版本中发生变化