我有这些模型定义:
class Property < ActiveRecord::Base
belongs_to :user
has_many :users_favourites_properties, class_name: 'UsersFavouritesProperties', dependent: :destroy, :foreign_key => :property_id
has_many :favourites, :class_name => "User", through: :users_favourites_properties
end
class User < ActiveRecord::Base
has_many :properties
has_many :users_favourites_properties, class_name: 'UsersFavouritesProperties', dependent: :destroy, :foreign_key => :user_id
has_many :favourites, class_name: "Property", through: :users_favourites_properties
end
class UsersFavouritesProperties < ActiveRecord::Base
self.table_name = "favourites"
belongs_to :favourites, class_name: 'User', :foreign_key => :user_id, :primary_key => :id
belongs_to :favourites, class_name: 'Property', :foreign_key => :property_id, :primary_key => :id, counter_cache: :users_count
end
执行时:
current_user.favourites << property
创建的UsersFavouritesProperties对象具有相同的user_id和property_id,因为user_id是使用property_id设置的。
你知道发生了什么吗?
答案 0 :(得分:3)
您似乎误解了关联名称的用途。
每个关联方法调用(如has_many
)都会向模型添加某些方法,以便轻松查找关联对象。
关联名称表示(在模型范围内)&#34;它对我来说是什么&#34; 。您首先指定的符号是关联名称,并且(除其他外)使用它作为您将用于访问该关联的方法的名称。
通过定义一次名为favourites
的关联,您已为UsersFavouritesProperties
定义了方法。第二次使用相同名称定义关联时,第一次关联是重新定义,并且可能会发生疯狂的事情。
因此,根据&#34;对我来说是什么&#34; 原则,您可以确定与某个User
相关联的UsersFavouritesProperty
是{{ 1}}&#39; s UsersFavouritesProperty
,以及由此产生的关联:
user
应该更简单:
belongs_to :favourites, class_name: 'User', :foreign_key => :user_id, :primary_key => :id
其余部分甚至不需要,因为它遵循Rails&#39;约定:类名和外键可以通过标准方式从关联名称派生(对于类名大写,为外键添加belongs_to :user
),主键是默认的。
我强烈建议您阅读您提供的Rails Style Guide和let ActiveRecord guess the most。
答案 1 :(得分:1)
这些行
belongs_to :favourites, ...
belongs_to :favourites, ...
应该是
belongs_to :user, ...
belongs_to :property, ...
belongs_to