ruby-on-rails Rails ActiveRecord从字符串更新属性

oo7oh9g9  于 2023-05-19  发布在  Ruby
关注(0)|答案(2)|浏览(134)

我试着使用.to_sym,但没有运气。不知道这是否可能。
我想根据字符串参数更新活动记录中的属性:

def update_settings(type, value)
    value = ActiveModel::Type::Boolean.new.cast(value)
    case type
    when 'sync_spotify'
      update(sync_spotify: value)
    when 'allowed_use_google_token'
      update(allowed_use_google_token: value)
    when 'allowed_use_spotify_token'
      update(allowed_use_spotify_token: value)
    when 'locale'
      update(locale: value)
    end
  end

type参数将始终与数据库中的列名匹配。有线索吗?这可能吗?

cetgtptt

cetgtptt1#

您可以定义一些允许的列表来检查更新属性是否在此列表中
然后动态更新
就像这样

BOOLEANS_ALLOWED_FOR_UPDATE = %i[
  sync_spotify
  allowed_use_google_token
  allowed_use_spotify_token
  locale
].freeze

def update_settings(type, value)
  type = type.to_sym

  raise ArgumentError unless BOOLEANS_ALLOWED_FOR_UPDATE.include?(type)

  value = ActiveModel::Type::Boolean.new.cast(value)

  update(type => value)
end

当然,你可以引发一些自定义错误,或者向模型示例中添加错误,或者只是返回。但无论如何,在更新之前使用一些保护子句是值得的

vfhzx4xs

vfhzx4xs2#

你能试着跟着吗?

def update_settings(type, value)
  value = ActiveModel::Type::Boolean.new.cast(value)
  case type
  when 'sync_spotify'
    update(sync_spotify: value)
  when 'allowed_use_google_token'
    update(allowed_use_google_token: value)
  when 'allowed_use_spotify_token'
    update(allowed_use_spotify_token: value)
  when 'locale'
    update(locale: value)
  else
    # If the type parameter doesn't match any of the column names, 
    # raise an error or handle it in some other way
    raise ArgumentError.new("Invalid type parameter: #{type}")
  end
end

您可以使用以下代码替换每种情况下的update方法调用:

send("#{type}=", value)

相关问题