2015-12-26 2 views
1

я сделал это:Как сопоставить модель с именами?

rails g model User 
rails g model User/Deal 

и заставить его работать

# model/user.rb 
module User 
    def self.table_name_prefix 
    'user_' 
    end 
    class User < ActiveRecord::Base 
    self.table_name = 'users' 
    end 
end 

# model/user/deal.rb 
class User::Deal < ActiveRecord::Base 
end 

, что я должен сделать, чтобы

использованием

User.create(name: 'jason')

вместо

User::User.create(name: 'jason')

Всегда использовать User::User слишком сложно.

ответ

0

Вы создали module User с определенной целью (я думаю). Может быть, ваша задача требует такого «усложнения»? Если некоторые части кода, который вы хотите заменить User::User с User:

module User 
    class AnotherUser 
    def create 
     User.create(name: 'jason') 
    end 
    end 
end 

Примечание: class AnotherUser находится под User имен! Для вызова из внешнего модуля вам необходимо использовать User::AnotherUser.

1

Просто сделайте следующее:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :deals, class_name: "User::Deal" 
end 

#app/models/user/deal.rb 
class User::Deal < ActiveRecord::Base 
    belongs_to :user 
end 

Таким образом, вы будете в состоянии назвать:

@user = User.create name: "Jason" 
@user.deals.create title: "2 for 1" 

Не совсем ответ, который вы ищете, так что я буду удалять, если вы хотите. Я честно думаю, что вы чрезмерно усложнять с модулем и т.д.


Update

Согласно docs, ваша вложенная модель будет автоматически искать имя module_class таблицы:

Вложенным классам присваиваются имена таблиц, предваряемые единственной формой имени таблицы родителя. Блокирующие модули не учитываются.

file     class    table_name 
invoice.rb   Invoice::Lineitem invoice_lineitems 

Однако примеры делают запутать меня.

Если он не работает, вы можете просто использовать self.table_prefix на классе:

#app/models/user/deal.rb 
class User::Deal < ActiveRecord::Base 
    def self.table_name_prefix 
     "user_" 
    end 
end 
+1

Ох. Да, это действительно то, что мне нужно. Но как насчет 'table_name_prefix', если я это сделал? Должен ли я добавить 'self.table_name = 'user_deals''' User :: Deal', чтобы исправить имя_таблицы? – jason

+0

Если вы хотите сохранить таблицу 'deals' только для' users' (мы этого не делаем, поэтому я не включил ее первоначально), тогда да, вам нужно будет использовать 'table_name_prefix'; Я могу добавить это к ответу, если вам нужна помощь с ним –

+0

Спасибо, пожалуйста, добавьте его. – jason

Смежные вопросы