Каков наилучший способ настроить мои таблицы и отношения для этого варианта использования? - PullRequest
0 голосов
/ 30 апреля 2010

1) У пользователя может быть много причин, и причина может принадлежать многим пользователям.

2) Пользователь может иметь несколько кампаний, а кампании могут принадлежать многим пользователям. Кампании принадлежат одной причине.

Я хочу иметь возможность назначать причины или кампании данному пользователю индивидуально. Таким образом, пользователю может быть назначена конкретная кампания. ИЛИ пользователю может быть назначена причина, и все кампании по этой причине должны быть связаны с пользователем.

Возможно ли это? И могу ли я настроить его так, чтобы отношения можно было упростить так:

User.causes = все причины, которые принадлежат пользователю

User.campaigns = все кампании, принадлежащие пользователю, независимо от того, связаны ли они с причиной или с ассоциацией кампании

Ответы [ 3 ]

1 голос
/ 30 апреля 2010

Это должно работать.

class User < ActiveRecord::Base
  has_many :causes, :through => :cause_users
  has_many :campaigns, :through => :campaign_users
  # other model stuff

class Cause < ActiveRecord::Base
  has_many :users, :through => :cause_users
  has-many :campaigns
  # other model stuff

class Campaign < ActiveRecord::Base
  belongs_to :cause
  has_many :users, :through => :campaign_users
  # other model stuff

class CampaignUser < ActiveRecord::Base
  belongs_to :campaign
  belongs_to :user
  # other model stuff

class CauseUser < ActiveRecord::Base
  belongs_to :cause
  belongs_to :user
  # other model stuff

has_many: для выполнения требуется, чтобы вы создали новую модель для каждого из этих объединений: campaign_users иause_users, как показано, но это обеспечивает больше функциональности позже, чем has_and_belongs_to_many.

Я бы также предложил использовать более подходящие имена, чем: campaign_users и: reason_users, чтобы отношения были более значимыми.

0 голосов
/ 30 апреля 2010

Вы можете создать: has_many: посредством ассоциаций между пользователями и кампаниями, использующими модель соединения, а также между пользователями и причинами, использующими другую модель соединения. Вы можете создать ассоциацию: has_many: кампаний в модели причин, поместив в модель кампании: own_to: reason.

Но вы не сможете выбрать все кампании или причины пользователей по User.campaigns.orders или User.order.campaigns. Вы должны выполнить итерацию по коллекции User.campaigns или User.causes, выбирая Campaign.cause или Cause.capaigns. Или даже создание собственного SQL-запроса с использованием объединений и условий для фильтрации информации в объединениях.

0 голосов
/ 30 апреля 2010

Я считаю, что вы должны использовать следующее:

class User < ActiveRecord::Base
   has_and_belongs_to_many :causes
   has_and_belongs_to_many :campaigns
end

class Cause < ActiveRecord::Base
   has_and_belongs_to_many :users
   has_many :campaigns
end

class Campaign < ActiveRecord::Base
   has_and_belongs_to_many :users
   belongs_to :cause
end

Таким образом, вы можете использовать

User.causes
User.campaigns

Cause.campaing
Cause.users

Campaign.users
Campaign.cause

Вы можете прочитать здесь о has_and_belongs_to_many отношениях, здесь о has_one и здесь о belongs_to.

Дайте мне знать, если вы этого хотите:]

Edit:

"Мне все еще нужны User.campaigns для быть кампании по причинам пользователя или отдельные кампании, связанные с Пользователь "

Вы можете иметь метод для модели пользователей, который возвращает все кампании. Примерно так:

def all_campaigns
   self.campaigns + self.causes.collect{ |c| c.campaigns }
end
...