以下是模型和协会。
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_many
或has_many: .., :through => ..
答案 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 关联。