Что такое правильное соглашение об именах для связанных таблиц и моделей в рельсах 3 - PullRequest
3 голосов
/ 01 апреля 2012

В моем приложении есть два типа пользователей: Инвесторы и Советники , у них обоих есть отдельная модель и таблица в базе данных (модель инвестора, модель советника, таблица инвестора и таблица советников) ).

Мне нужно создать таблицу для хранения данных профиля консультанта и другую таблицу для профиля инвестора (в профиле у них совершенно разные поля, поэтому я не могу объединиться в одну таблицу). Какое имя я должен дать ему? Если я называю это investor_profile - тогда каждый раз, когда я хочу получить от него данные, мне приходится называть это investor->investor_profile->field_name, но это плохо для того, чтобы напечатать инвестор дважды.

Любые советы для правильного имени? Или, может быть, уловка, чтобы сделать это investor->profile->field_name?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 апреля 2012

Я считаю, что имеет смысл иметь investor_profile и advisor_profile , если они отличаются и, следовательно, вы не можете использовать одну и ту же модель.

Не беспокойтесьо доступе и повторении имен, потому что вы можете сделать это:

class Investor
     has_one :profile, class_name: "InvestorProfile"
end

И, получив объект инвестора, вы сможете делать такие вещи, как @investor.profile.profile_field

2 голосов
/ 01 апреля 2012

Вы можете хранить разные таблицы для investor_profiles и advisor_profiles с отдельными моделями InvestorProfile, AdvisorProfile (которые могут наследоваться от базового класса Profile, при условии, что они имеют хотя бы незначительное перекрытие).

Но в ваших модельных связях используйте опцию :class_name, чтобы скрыть _profiles:

class Investor < ActiveRecord::Base
 has_one :profile, :class_name => "InvestorProfile" 
end


class Advisor < ActiveRecord::Base
 has_one :profile, :class_name => "AdvisorProfile" 
end

# And since the profiles probably overlap in some way
# a profile base class which the other 2 profile classes extend
class Profile < ActiveRecord::Base
  # base options like name, address, etc...
end  
class InvestorProfile < Profile
  # Investor-specific stuff
end
class AdvisorProfile < Profile
  # Advisor-specific stuff
end

На практике вы можете ссылаться на него как self.profile:

# Use it as
adv = Advisor.new
puts adv.profile.inspect

См. ActiveRecord::Associations документацию для описания опций.

1 голос
/ 01 апреля 2012

Вы можете назвать ассоциацию как хотите и указать название класса модели:

class InvestorProfile < ActiveRecord::Base
  # Investor_profiles table must contain an investor_id column
  belongs_to :investor
end

class Investor < ActiveRecord::Base
  # Thanks to the :class_name option rails know what a profile is
  has_one :profile, :class_name => "InvestorProfile"
end

и затем вы можете получить доступ к полям профиля, используя что-то вроде этого @investor.profile.field_name.

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