Ниже приведены модели и ассоциации.
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
%п
= f.label: name
% уш
= f.text_field: name
%п
= f.label: client_id, "Client"
% уш
= f.collection_select (: client_id, Client.all,: id,: name, {: prompt => «Пожалуйста, выберите клиента»}, {: class => «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 => ..