Has_many通过实体之间的多种关系

时间:2014-10-22 16:35:43

标签: ruby-on-rails

我有这些模型定义:

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设置的。

你知道发生了什么吗?

2 个答案:

答案 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 Guidelet ActiveRecord guess the most

答案 1 :(得分:1)

这些行

belongs_to :favourites, ...
belongs_to :favourites, ...

应该是

belongs_to :user, ...
belongs_to :property, ...

belongs_to

不能使用两个键