Skip to content

Commit

Permalink
Merge pull request #560 from avit/association-conditions-rails3
Browse files Browse the repository at this point in the history
Avoid overwriting association conditions with default scope in Rails 3
  • Loading branch information
jonatack committed Jul 12, 2015
2 parents f77437e + 7320bf9 commit aee1985
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 27 deletions.
18 changes: 7 additions & 11 deletions lib/ransack/adapters/active_record/3.0/context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -182,23 +182,19 @@ def build_or_find_association(name, parent = @base, klass = nil)
:build, Polyamorous::Join.new(name, @join_type, klass), parent
)
found_association = @join_dependency.join_associations.last
apply_default_conditions(found_association)

default_conditions = found_association.active_record.scoped.arel.constraints
if default_conditions.any?
and_default_conditions = "AND #{default_conditions.reduce(&:and).to_sql}"
end

# Leverage the stashed association functionality in AR
@object = @object.joins(found_association)
@object = @object.joins(found_association).joins(and_default_conditions)
end

found_association
end

def apply_default_conditions(join_association)
reflection = join_association.reflection
default_scope = join_association.active_record.scoped
default_conditions = default_scope.arel.where_clauses
if default_conditions.any?
reflection.options[:conditions] = default_conditions
end
end

end
end
end
Expand Down
24 changes: 10 additions & 14 deletions lib/ransack/adapters/active_record/3.1/context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ def join_associations
#
def join_sources
base = Arel::SelectManager.new(@object.engine, @object.table)
joins = @object.joins_values
joins.each do |assoc|
@object.joins_values.each do |assoc|
next unless assoc.is_a?(JoinDependency::JoinAssociation)
assoc.join_to(base)
end
base.join_sources
Expand Down Expand Up @@ -151,7 +151,7 @@ def build_join_dependency(relation)
Constants::STRING_JOIN
when Hash, Symbol, Array
Constants::ASSOCIATION_JOIN
when ::ActiveRecord::Associations::JoinDependency::JoinAssociation
when JoinDependency::JoinAssociation
Constants::STASHED_JOIN
when Arel::Nodes::Join
Constants::JOIN_NODE
Expand Down Expand Up @@ -196,23 +196,19 @@ def build_or_find_association(name, parent = @base, klass = nil)
:build, Polyamorous::Join.new(name, @join_type, klass), parent
)
found_association = @join_dependency.join_associations.last
apply_default_conditions(found_association)

default_conditions = found_association.active_record.scoped.arel.constraints
if default_conditions.any?
and_default_conditions = "AND #{default_conditions.reduce(&:and).to_sql}"
end

# Leverage the stashed association functionality in AR
@object = @object.joins(found_association)
@object = @object.joins(found_association).joins(and_default_conditions)
end

found_association
end

def apply_default_conditions(join_association)
reflection = join_association.reflection
default_scope = join_association.active_record.scoped
default_conditions = default_scope.arel.where_clauses
if default_conditions.any?
reflection.options[:conditions] = default_conditions
end
end

end
end
end
Expand Down
5 changes: 3 additions & 2 deletions spec/ransack/search_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,10 @@ module Ransack
expect(condition.value).to eq 'Ernie'
end

it 'preserves default scope conditions for associations' do
search = Search.new(Person, articles_title_eq: 'Test')
it 'preserves default scope and conditions for associations' do
search = Search.new(Person, published_articles_title_eq: 'Test')
expect(search.result.to_sql).to include 'default_scope'
expect(search.result.to_sql).to include 'published'
end

it 'discards empty conditions' do
Expand Down
6 changes: 6 additions & 0 deletions spec/support/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ class Person < ActiveRecord::Base
belongs_to :parent, :class_name => 'Person', :foreign_key => :parent_id
has_many :children, :class_name => 'Person', :foreign_key => :parent_id
has_many :articles
if ActiveRecord::VERSION::MAJOR == 3
has_many :published_articles, conditions: { published: true }, class_name: "Article"
else
has_many :published_articles, ->{ where(published: true) }, class_name: "Article"
end
has_many :comments
has_many :authored_article_comments, :through => :articles,
:source => :comments, :foreign_key => :person_id
Expand Down Expand Up @@ -171,6 +176,7 @@ def self.create
t.string :title
t.text :subject_header
t.text :body
t.boolean :published, default: true
end

create_table :comments, :force => true do |t|
Expand Down

0 comments on commit aee1985

Please sign in to comment.