On Mar 8, 11:57 am, Max <[email protected]> wrote:
> Hi,
>
> I'd like to draw attention to update_only -- the current
> implementation of set_restricted creates some unexpected behavior.
>
> So assume you have a model with attributes id, field1, and field2,
> with id being the pk.  If you have a hash that's {"id" => 3, "field1"
> => "foo", "field2" => "bar"}, and you say my_model.update_only
> (the_hash, "field1"), then you'll get a "method id= doesn't exist or
> access is restricted to it" if strict is enabled, which appears to be
> by default.
>
> The current doc describes update_only this way: "Update the values
> using the entries in the hash, only if the key is included in only."
>
> Does this make any sense?  If I say "only update these fields" then
> presumably it should only be updating those fields, right?  It doesn't
> seem logical to me that I say "only update these fields" and then it
> throws an error trying to update a field I didn't specify.

This wasn't really planned, it's more of an implementation detail, but
it is consistent when you consider how the other set/update methods
behave.  You can use "my_model.strict_param_setting = false" (or a
similar change on a per model or global basis) currently to do what
you want.  I agree that the RDoc should be more descriptive.

Before I consider changing the behavior, their should be a discussion
of what the semantics should be.  Currently, the semantics are (set|
update)_only are:

1) The allowed setter methods are set to only the columns given.
2) For each key in the hash, attempt to call the setter method.
3) If the setter method isn't in the list of allowed setter methods,
raise an error unless strict_param_setting is false.

Are you suggesting set_only be treated as if that strict_param_setting
is always false?  That's not hard to do, but I don't like the lack of
consistency.  If you are suggesting that setter methods for the
columns given be called regardless of what is in the hash, that's more
difficult, as both strings and symbols are allowed as keys (the hash
could be converted to all strings first, but I don't like that idea).

In the next version of Sequel, this will be very easy to do globally
via a plugin such as:

  module Sequel
    module Plugins
      module SetOnlyNotStrict
        module InstanceMethods
          def set_only(*args)
            old = strict_param_setting
            self.strict_param_setting = false
            begin
              super
            ensure
              self.strict_param_setting = false
            end
          end
        end
      end
    end
  end
  Model.plugin :set_only_not_strict

Or you will be able to override it directly in Model:

  class Sequel::Model
    def set_only(*args)
      old = strict_param_setting
      self.strict_param_setting = false
      begin
        super
      ensure
        self.strict_param_setting = false
      end
    end
  end

You can't do either in 2.11, unless you apply the plugin/define the
method in all of the subclasses.

Jeremy
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to