Don't allow a has_one association to go :through a collection association [#2976 state:resolved]
This commit is contained in:
parent
d6efd3cfc2
commit
c6db37e69b
|
@ -32,6 +32,12 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
class HasOneThroughCantAssociateThroughCollection < ActiveRecordError #:nodoc:
|
||||
def initialize(owner_class_name, reflection, through_reflection)
|
||||
super("Cannot have a has_one :through association '#{owner_class_name}##{reflection.name}' where the :through association '#{owner_class_name}##{through_reflection.name}' is a collection. Specify a has_one or belongs_to association in the :through option instead.")
|
||||
end
|
||||
end
|
||||
|
||||
class HasManyThroughSourceAssociationNotFoundError < ActiveRecordError #:nodoc:
|
||||
def initialize(reflection)
|
||||
through_reflection = reflection.through_reflection
|
||||
|
|
|
@ -388,6 +388,10 @@ module ActiveRecord
|
|||
raise HasManyThroughSourceAssociationMacroError.new(self)
|
||||
end
|
||||
|
||||
if macro == :has_one && through_reflection.collection?
|
||||
raise HasOneThroughCantAssociateThroughCollection.new(active_record.name, self, through_reflection)
|
||||
end
|
||||
|
||||
check_validity_of_inverse!
|
||||
end
|
||||
|
||||
|
|
|
@ -25,10 +25,6 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|||
assert_equal clubs(:boring_club), @member.club
|
||||
end
|
||||
|
||||
def test_has_one_through_with_has_many
|
||||
assert_equal clubs(:moustache_club), @member.favourite_club
|
||||
end
|
||||
|
||||
def test_creating_association_creates_through_record
|
||||
new_member = Member.create(:name => "Chris")
|
||||
new_member.club = Club.create(:name => "LRUG")
|
||||
|
@ -235,6 +231,12 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
|
|||
end
|
||||
|
||||
def test_has_one_through_with_default_scope_on_join_model
|
||||
assert_equal posts(:welcome).comments.order('id').first, authors(:david).comment_on_first_posts
|
||||
assert_equal posts(:welcome).comments.order('id').first, authors(:david).comment_on_first_post
|
||||
end
|
||||
|
||||
def test_has_one_through_many_raises_exception
|
||||
assert_raise(ActiveRecord::HasOneThroughCantAssociateThroughCollection) do
|
||||
members(:groucho).club_through_many
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -28,7 +28,9 @@ class Author < ActiveRecord::Base
|
|||
|
||||
has_many :first_posts
|
||||
has_many :comments_on_first_posts, :through => :first_posts, :source => :comments, :order => 'posts.id desc, comments.id asc'
|
||||
has_one :comment_on_first_posts, :through => :first_posts, :source => :comments, :order => 'posts.id desc, comments.id asc'
|
||||
|
||||
has_one :first_post
|
||||
has_one :comment_on_first_post, :through => :first_post, :source => :comments, :order => 'posts.id desc, comments.id asc'
|
||||
|
||||
has_many :thinking_posts, :class_name => 'Post', :conditions => { :title => 'So I was thinking' }, :dependent => :delete_all
|
||||
has_many :welcome_posts, :class_name => 'Post', :conditions => { :title => 'Welcome to the weblog' }
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
class Member < ActiveRecord::Base
|
||||
has_one :current_membership
|
||||
has_many :memberships
|
||||
has_one :membership
|
||||
has_many :fellow_members, :through => :club, :source => :members
|
||||
has_one :club, :through => :current_membership
|
||||
has_one :favourite_club, :through => :memberships, :conditions => ["memberships.favourite = ?", true], :source => :club
|
||||
has_one :favourite_club, :through => :membership, :conditions => ["memberships.favourite = ?", true], :source => :club
|
||||
has_one :sponsor, :as => :sponsorable
|
||||
has_one :sponsor_club, :through => :sponsor
|
||||
has_one :member_detail
|
||||
has_one :organization, :through => :member_detail
|
||||
belongs_to :member_type
|
||||
end
|
||||
|
||||
has_many :current_memberships
|
||||
has_one :club_through_many, :through => :current_memberships, :source => :club
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue