我正在处理一个相当简单的has_many through:我可以让class_name/foreign_键参数朝一个方向工作,但不能朝另一个方向工作.也许你能帮我.(另一方面,如果Rails 4有区别的话,我使用的是Rails 4):
中文:一个用户通过ListingManager管理多个列表,一个列表由多个用户通过ListingManager管理.Listing manager有一些数据字段,与这个问题无关,所以我在下面的代码中对它们进行了编辑
以下是最简单的部分:
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
从上面可以猜到,ListingManager表如下所示:
create_table "listing_managers", force: true do |t|
t.integer "listing_id"
t.integer "manager_id"
end
所以这里唯一不简单的是ListingManager使用manager_id
而不是user_id
不管怎样,上面的方法是有效的.我可以拨打user.listings
获取与该用户相关联的列表,也可以拨打listing.managers
获取与该列表相关联的经理.
然而(问题是这样的),我觉得说user.listings
没有太大意义,因为用户也可以"拥有"而不是"管理"列表,我真正想要的是user.managed_listings
,所以我调整了user.rb
来改变
这与上面listing.rb
中的代码完全相似,所以我认为这应该马上就能实现.相反,我的rspec测试会说:
测试是:
it "manages many managed_listings" do
user = FactoryGirl.build(:user)
l1 = FactoryGirl.build(:listing)
l2 = FactoryGirl.build(:listing)
user.managed_listings << l1
user.managed_listings << l2
expect( @user.managed_listings.size ).to eq 2
end
现在,我确信我什么都不知道.是的,我想我可以做一个别名,但我很担心在listing.rb
中使用的相同技术在user.rb
中似乎不起作用.你能解释一下吗?
更新:
it "manages many managed_listings" do
l1 = FactoryGirl.create(:listing)
@user = User.last
ListingManager.destroy_all
@before_count = ListingManager.count
expect( @before_count ).to eq 0
lm = FactoryGirl.create(:listing_manager, manager_id: @user.id, listing_id: l1.id)
expect( @user.managed_listings.count ).to eq 1
end
上述方法失败了.Rails生成错误PG::UndefinedColumn: ERROR: column listing_managers.user_id does not exist
(它应该查找'listing_managers.manager_id').所以我认为协会的用户端仍然存在一个错误.在user.rb
的has_many :managed_listings, through: :listing_managers, source: :listing
中,用户如何知道使用manager_id
来获取其列表?