1 has_many: ..,: through и 1 has_and_belongs_to_many: .. проблема? - PullRequest
1 голос
/ 23 апреля 2010

Ниже приведены модели и ассоциации.

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 => ..

1 Ответ

3 голосов
/ 23 апреля 2010

Вы можете переименовать ваши ассоциации.В модели Vendor:

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

и в модели Client:

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

Тогда, например, vendor.clients вызовет ассоциацию habtm и vendor.campaign_clients вызовет ассоциацию : через .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...