我正在处理一个相当简单的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.rbhas_many :managed_listings, through: :listing_managers, source: :listing中,用户如何知道使用manager_id来获取其列表?

推荐答案

这里的问题是

has_many :managers, through: :listing_managers

ActiveRecord可以推断连接模型上的关联名称(:listing_managers)because it has the same name是您正在定义的has_many :through个关联.也就是说,房源和房源管理者都有很多 Select .

但你的另一个社团却不是这样.这里有一个列表管理器has_many :listings,但有一个用户has_many :managed_listings.因此ActiveRecord无法推断ListingManager上应该使用的关联的名称.

这就是:source选项的用途(参见http://guides.rubyonrails.org/association_basics.html#has-many-association-reference).所以正确的声明应该是:

has_many :managed_listings, through: :listing_managers, source: :listing

(另一方面,你实际上不需要其他has_many :through上的:foreign_key:class_name选项.你可以使用这些选项定义direct个关联,然后你只需要在has_many :through上指向:through模型上的正确关联.)

Ruby-on-rails相关问答推荐

如何测试自定义路由?

如何在_serialize之前执行代码?""或者如何在序列化属性之前对属性进行清理?

删除链接不起作用,重定向 echo 示 Ruby

根据表单内的 Select 字段值渲染部分内容

一对多关联 counter_cache 在 Rails 中无法正确重新加载

在 POST 请求中添加了 Rails 奇怪的参数

如何在 Arel 中重用单个绑定变量?

Heroku 应用程序上的远程 mysql 数据库

Rails 100% 新手问题 - send() 方法

如何使用 capistrano deploy 定位特定的提交 SHA

Rails:设计:按角色登录后重定向

如何在 Rails 应用程序中使用长 id?

如何按值按降序对哈希进行排序并在 ruby​​ 中输出哈希?

Rails 成语避免在 has_many 中重复:通过

如何使用 Ruby 在现有 PDF 上编辑或书写?

参数错误:范围主体需要可调用

确认后如何进行设计重定向

'respond_to' 格式语句中的 `:location => ...` 和 `head :ok` 是什么意思?

Rails - 如何在用户登录时覆盖设计 SessionsController 以执行特定任务?

ruby on rails 如何处理 NaN