1 has_many:..,:through和1 has_and_belongs_to_many:..问题?

时间:2010-04-23 08:34:59

标签: ruby-on-rails activerecord associations

以下是模型和协会。

class Vendor < ActiveRecord::Base
  attr_accessible :name, :address_attributes
  has_many :campaigns
  has_many :clients, :through => :campaigns
end

class Client < ActiveRecord::Base
  attr_accessible :name
  has_many :campaigns
  has_many :vendors, :through => :campaigns
end

class Campaign < ActiveRecord::Base
  attr_accessible :name, :vendor_id, :client_id, :start_date, :end_date
  belongs_to :client
  belongs_to :vendor
end

这是新的广告系列创建表单      - form_for @campaign do | f |       = f.error_messages       %p         = f.label:名字         %BR         = f.text_field:名字       %p         = f.label:client_id,“客户端”         %BR         = f.collection_select(:client_id,Client.all,:id,:name,{:prompt =&gt;“请选择客户端”},{:class =&gt;“client_list”})

现在,关联方法@vendor.clients将仅通过campaign联接模型列出客户端。 如果广告系列表格为空白,则clients

不会显示任何@vendor.clients

但正如您在新广告系列表单中的collection_select中所看到的,我必须能够选择属于该供应商的客户端。所以,我不得不拨打Client.all电话。 虽然它会呈现集合选择,但所有这些客户端都会列出,尽管它们不属于该供应商。

因此,为了获得/创建/关联客户端和供应商并获得@vendor.clients虽然未创建campaign,但我不得不在供应商和客户之间添加多对多关联,对吗?

如果我确实创建了habtm协会,它会相互冲突,对吗?

class Vendor < ActiveRecord::Base
  attr_accessible :name, :address_attributes
  has_many :campaigns
  has_many :clients, :through => :campaigns
  has_and_belongs_to_many :clients
end

class Client < ActiveRecord::Base
  attr_accessible :name
  has_many :campaigns
  has_many :vendors, :through => :campaigns
  has_and_belongs_to_many :vendors
end

我怎么解决这个问题?现在,如果我这样做,@vendor.clients@client.vendors,哪个关联被调用?

has_and_belongs_to_manyhas_many: .., :through => ..

的那个

1 个答案:

答案 0 :(得分:3)

您可以重命名您的关联。在供应商模型中:

has_many :campaign_clients, :through => :campaigns, :class_name => 'Client', :source => :client

并在客户端模型中:

has_many :campaign_vendors, :through => :campaigns, :class_name => 'Vendor', :source => :vendor

然后,例如,vendor.clients将触发 habtm 关联,vendor.campaign_clients将触发:through 关联。