当使用/不使用self时调用本地方法的方式不同.为什么?

Wil*_*ill 0 ruby ruby-on-rails

我有User与之has_many关系的模型UserFilter.UserFilter与...有belongs关系User.

在User模型中,我有一个名为的方法 update_user_filters(filter_params_array)

这种方法user_filters像这样修改

def update_user_filters(filter_params_array)
  new_filters = []
  old_filter = user_filters 

  filters_params_array.each do |filter_params|
    if filter_params[:id].blank? #if the filter does not yet exist
      new_filters << UserFilter.new(filter_params)
    end
  end
  user_filters = new_filters
end
Run Code Online (Sandbox Code Playgroud)

user_filters会将其设置为预期值,但在保存时不会更新user_filters数据库中的值.

但是,如果我将分配更改为以下内容,则确实如此.有人可以解释为什么会这样吗?

self.user_filters = new_filters
Run Code Online (Sandbox Code Playgroud)

请注意,当我user_filters在模型中首次引用时,在db中执行select操作,因此我不确定此本地方法在使用self和不使用时的工作方式不同self

Pet*_*ter 6

user_filters只是创建一个局部变量.self.user_filters将它分配给对象.你可能想要的@user_filters = ....

  • 这是与Ruby混淆的常见问题.看,Ruby解释器不知道"user_filters ="是设置局部变量还是调用方法 - 所以它执行前者.这就是为什么你需要"self.user_filters ="来确保它调用方法,而不是设置局部变量. (2认同)