我正在使用相当简单的has_many:我可以使class_name/foreign_key参数在一个方向上工作但在另一个方向上工作的情况.也许你可以帮助我.(ps我正在使用Rails 4,如果这会产生差异):
英语:用户通过ListingManager管理许多列表,并且许多用户通过ListingManager管理列表.清单管理器有一些数据字段,与这个问题没有密切关系,因此我在下面的代码中对它们进行了编辑
这是有效的简单部分:
class User < ActiveRecord::Base
has_many :listing_managers
has_many :listings, through: :listing_managers
end
class Listing < ActiveRecord::Base
has_many :listing_managers
has_many :managers, through: :listing_managers, class_name: "User", foreign_key: "manager_id"
end
class ListingManager < ActiveRecord::Base
belongs_to :listing
belongs_to :manager, class_name:"User"
attr_accessible :listing_id, :manager_id
end
Run Code Online (Sandbox Code Playgroud)
正如你可以从上面猜到的那样,ListManager表看起来像:
create_table "listing_managers", force: true do |t|
t.integer "listing_id"
t.integer "manager_id"
end
Run Code Online (Sandbox Code Playgroud)
所以这里唯一不简单的就是ListingManager使用manager_id而不是user_id
无论如何,以上工作.我可以打电话user.listings来获取与用户关联的列表,我可以打电话listing.managers来获取与列表相关联的经理.
然而(这里是问题),我认为说起来并不是非常有意义,user.listings因为用户也可以"拥有"而不是"管理"列表,我真正想要的是user.managed_listings 所以我调整user.rb了改变has_many:listing,通过:: listing_managers到has_many:managed_listings,通过:: listing_managers,class_name:"Listing",foreign_key:"listing_id"
这与listing.rb上面的代码完全类似,所以我认为这应该可以正常工作.相反,我对这个barfs的rspec测试说
ActiveRecord::HasManyThroughSourceAssociationNotFoundError:
Could not find …