小编JCQ*_*JCQ的帖子

has_many:通过class_name和foreign_key

我正在使用相当简单的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 …

ruby-on-rails ruby-on-rails-4

40
推荐指数
2
解决办法
2万
查看次数

标签 统计

ruby-on-rails ×1

ruby-on-rails-4 ×1