1. 03 12月, 2013 1 次提交
  2. 21 11月, 2013 1 次提交
    • J
      Fix ActiveRecord::Relation#unscope · 64b9e93b
      Jon Leighton 提交于
      I'm pretty confused about the addition of this method. The documentation
      says that it was intended to allow the removal of values from the
      default scope (in contrast to #except). However it behaves exactly the
      same as except: https://gist.github.com/jonleighton/7537008 (other than
      having a slightly enhanced syntax).
      
      The removal of the default scope is allowed by
      94924dc3, which was not a change we
      could make until 4.1 due to the need to deprecate things. However after
      that change #unscope still gives us nothing that #except doesn't already
      give us.
      
      However there *is* a desire to be able to unscope stuff in a way that
      persists across merges, which would allow associations to be defined
      which unscope stuff from the default scope of the associated model. E.g.
      
        has_many :comments, -> { unscope where: :trashed }
      
      So that's what this change implements. I've also corrected the
      documentation. I removed the guide references to #except as I think
      unscope really supercedes #except now.
      
      While we're here, there's also a potential desire to be able to write
      this:
      
        has_many :comments, -> { unscoped }
      
      However, it doesn't make sense and would not be straightforward to
      implement. While with #unscope we're specifying exactly what we want to
      be removed from the relation, with "unscoped" we're just saying that we
      want it to not have some things which were added earlier on by the
      default scope. However in the case of an association, we surely don't
      want *all* conditions to be removed, otherwise the above would just
      become "SELECT * FROM comments" with no foreign key constraint.
      
      To make the above work, we'd have to somehow tag the relation values
      which get added when evaluating the default scope in order to
      differentiate them from other relation values. Which is way too much
      complexity and therefore not worth it when most use cases can be
      satisfied with unscope.
      
      Closes #10643, #11061.
      64b9e93b
  3. 08 11月, 2013 1 次提交
  4. 03 11月, 2013 1 次提交
  5. 21 10月, 2013 2 次提交
  6. 06 8月, 2013 1 次提交
  7. 30 7月, 2013 1 次提交
    • R
      Revert change on ActiveRecord::Relation#order method that prepends new · 92c5a224
      Rafael Mendonça França 提交于
      order on the old ones
      
      The previous behavior added a major backward incompatibility since it
      impossible to have a upgrade path without major changes on the
      application code.
      
      We are taking the most conservative path to be consistent with the idea
      of having a smoother upgrade on Rails 4.
      
      We are reverting the behavior for what was in Rails 3.x and,
      if needed, we will implement a new API to prepend the order clauses in
      Rails 4.1.
      92c5a224
  8. 09 7月, 2013 1 次提交
  9. 04 7月, 2013 1 次提交
  10. 02 7月, 2013 1 次提交
  11. 29 6月, 2013 1 次提交
  12. 28 6月, 2013 1 次提交
    • J
      Simplify/fix implementation of default scopes · 94924dc3
      Jon Leighton 提交于
      The previous implementation was necessary in order to support stuff
      like:
      
          class Post < ActiveRecord::Base
            default_scope where(published: true)
            scope :ordered, order("created_at")
          end
      
      If we didn't evaluate the default scope at the last possible moment
      before sending the SQL to the database, it would become impossible to
      do:
      
          Post.unscoped.ordered
      
      This is because the default scope would already be bound up in the
      "ordered" scope, and therefore wouldn't be removed by the
      "Post.unscoped" part.
      
      In 4.0, we have deprecated all "eager" forms of scopes. So now you must
      write:
      
          class Post < ActiveRecord::Base
            default_scope { where(published: true) }
            scope :ordered, -> { order("created_at") }
          end
      
      This prevents the default scope getting bound up inside the "ordered"
      scope, which means we can now have a simpler/better/more natural
      implementation of default scoping.
      
      A knock on effect is that some things that didn't work properly now do.
      For example it was previously impossible to use #except to remove a part
      of the default scope, since the default scope was evaluated after the
      call to #except.
      94924dc3
  13. 29 4月, 2013 1 次提交
  14. 05 4月, 2013 2 次提交
    • J
      Fix scope chaining + STI · 8606a7fb
      Jon Leighton 提交于
      See #9869 and #9929.
      
      The problem arises from the following example:
      
          class Project < ActiveRecord::Base
            scope :completed, -> { where completed: true }
          end
      
          class MajorProject < Project
          end
      
      When calling:
      
          MajorProject.where(tasks_count: 10).completed
      
      This expands to:
      
          MajorProject.where(tasks_count: 10).scoping {
            MajorProject.completed
          }
      
      However the lambda for the `completed` scope is defined on Project. This
      means that when it is called, `self` is Project rather than
      MajorProject. So it expands to:
      
          MajorProject.where(tasks_count: 10).scoping {
            Project.where(completed: true)
          }
      
      Since the scoping was applied on MajorProject, and not Project, this
      fails to apply the tasks_count condition.
      
      The solution is to make scoping apply across STI classes. I am slightly
      concerned about the possible side-effects of this, but no tests fail and
      it seems ok. I guess we'll see.
      8606a7fb
    • N
      failing test for #9869 · f029fb07
      Neeraj Singh 提交于
      f029fb07
  15. 30 3月, 2013 3 次提交