В Rails 3.1 как мне отформатировать объявления ассоциации ActiveRecord для модели с большим количеством из них? - PullRequest
0 голосов
/ 22 октября 2011

В моем проекте Rails 3.1 у меня есть несколько моделей с множеством ассоциаций.Используя декларации ассоциации ActiveRecord, я получаю файлы моделей, которые выглядят следующим образом:

# app/models/some_model.rb

class SomeModel < ActiveRecord::Base
  belongs_to :other_model
  has_many :more_models
  has_many :yet_more_models, :through => :more_models
  has_one :another_model, :dependent => :destroy

  # ... these declarations continue,
  # and continue,
  # and continue,
  # all the way down to line 32
end

Это быстро становится чрезвычайно уродливым и ослабляет мое понимание / мотивацию / счастье.Что я могу сделать для смягчения?

  • [a] Форматировать / группировать / делать отступы для них определенным образом?
  • [b] Переосмыслите мою модель данных, так как это может быть признаком плохого дизайна
  • [c] Живите с этим - все файлы моделей выглядят так.

Ответы [ 4 ]

1 голос
/ 22 октября 2011

можно ли сгруппировать их по различным аспектам / функциям вашего SomeModel? У этих групп ассоциаций, как правило, достаточно много сопутствующих методов в вашем SomeModel классе? в этом случае может помочь разделение вашей модели на несколько модулей (например, признаков), по одному для каждого аспекта, связывающих все, включая методы класса и объявления ассоциаций.

, например

class SomeModel
  include SomeModel::ThisBehavior
  include SomeModel::ThatFeature
end

и

module SomeModel::ThisBehavior
  extend ActiveSupport::Concern

  included do
    has_many :this
    has_many :that
    belongs_to :those

    attr_protected :a, :b
    attr_accessor :c, :d
  end

  def do_this
  end

  ...

  module ClassMethods
    ...
  end
end

Следующим шагом может быть попытка сделать эти модули достаточно независимыми и соответствующим образом сгруппировать ваши тесты.

0 голосов
/ 23 октября 2011

Может быть, вы можете распространять родительские модели на другие ...

Например, у меня есть приложение, которое использует три разных экземпляра пользователя:

class User < ActiveRecord::Base
    has_one :social_profile
    has_one :tasks_profile
    has_one :bank_account
end

И другие модели, представляющие пользователя в других областях проекта:

class SocialProfile < ActiveRecord::Base
    belongs_to :user
    has_many :many_things
    ...
end

То же самое для TasksProfile и BankAccount.

0 голосов
/ 23 октября 2011

У вас может быть модель с множеством ассоциаций, и это хорошо для меня.Если за этим стоит сложная логика, это приведет к сложной связке.Например, у меня есть класс Account, в котором более 60 ассоциаций: пользователи, компании, центры, продукты, документы, маршруты, транспортные средства .....

Этот вопрос больше о удобочитаемости.Прежде всего, определитесь с соглашением и следуйте одному и тому же правилу во всем проекте (сначала принадлежат, принадлежат первому, второму, второму, третьему, последнему). Второй совет: если некоторые отношения явно связаны с хорошо разделенной функциональностью, вы можете разделить свой класс нанекоторые модули сохраняют каждое отношение в соответствующих модулях.Но это общее правило.

class Account < ActiveRecord::Base
  include Account::CRM
  include Account::Plans
  include Account::Finances      

end
0 голосов
/ 22 октября 2011

Общее правило - выравнивать связанные назначения по вертикали.Это относится и к связанным объявлениям.

class SomeModel < ActiveRecord::Base
  belongs_to :other_model
  has_many   :more_models
  has_many   :yet_more_models, :through => :more_models
  has_one    :another_model,   :dependent => :destroy
end

Если вы считаете это многословным, вы не видели моделей DataMapper: P

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