2015-12-06 5 views
-1

У меня есть модель say Apps, и каждое приложение содержит кучу пользователей и ссылку на тип хранилища и имеет свойства, имя, app_id, версию и цену.Как связать клон с его родителем в Rails?

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

Я хотел бы сделать это, добавив свойство/столбец в мое приложение под названием «Is_clone», и мне нужна вторая таблица под названием AppToClone, которая имеет два столбца App и Clone. В каждом ряду я скажу App: 1, Clone: ​​[2,5,7,26]

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

Я настроил базу данных для AppToClone, но я зациклился на том, как создать эту ассоциацию в самой модели приложения. Примеры, которые я нашел до сих пор, такие как gem rails_lookup_tables, похоже, допускают только одно значение, а не массив в таблице AppToClone.

В настоящее время в моей модели App У меня есть следующие строки: :has_many :apps, through: :appstoclones Но это не чувствует себя правильно для меня, и я не уверен, как построить эту базу данных в течение долгого времени.

Чувство, похоже, глупо здесь, но я застрял.

ответ

0

Я бы сказал, что вы ищете имеет-многие относится к отношениям.

Для HAS-многие части: http://guides.rubyonrails.org/association_basics.html#the-has-many-association

Для принадлежит к расстанемся: http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association

Одна модель будет вполне приложение, другой клон, где таблица клон будет хранить те же поля, что и приложение, а также дополнительные поля, необходимые для экземпляра клона. Наследуя модель клона из модели приложения, которая наследуется от ActiveRecord, можно использовать клон в коде, где используется приложение.

+0

Извините, я не знал, с какого этапа я застрял. У меня есть эта часть, я просто не понимаю, как их создавать, и убедитесь, что таблица AppToClone поддерживает все соединения. – Bob

+0

Я сейчас нахожусь: has_many: apps через:: apptoclones, но я не уверен, что это правильно – Bob

+0

Если я правильно вас понимаю: одно приложение _has many_ clones, один клон _belongs to_ one app? Если это правильно, просто смоделируйте его:) Вам нужно только отношение _has-many-through_, если вы хотите сохранить дополнительные данные в таблице ссылок. – benjamin

1

Таким образом, ассоциация has_many и belongs_to хранит данные по-другому, чем указывает вопрос. Я бы использовал однонаправленное наследование, имея модель Clone, наследуемую от модели приложения.

class App < ActiveRecord::Base 
    has_many :clones 
end 

class Clone < App 
    belongs_to :app 
end 

Вы должны были бы иметь APP_ID и тип на ваше приложение таблицы (странно, я знаю), так что ваш клон может быть связано. То, что вы могли бы сделать, это запросить ваш клон в качестве приложения.

Clone.last.is_a? App 
-> true 

То, что я думаю, что ближе всего к тому, что вы на самом деле хотите, хотя, как указано в разделе 2.10 Self Joins на Ruby On Rails Guides.

class App < ActiveRecord::Base 
    has_many :clones, class_name: "App", 
         foreign_key: "parent_app_id" 

    belongs_to :parent_app, class_name: "App" 
end 

Вам необходимо создать foreign_key при миграции.

Для реализации is_clone: ​​

def is_clone? 
    !!self.parent_app_id 
end 

Для реализации AppToClone: ​​

def clone_ids 
    self.clones.all.map(&id) 
end 

# Check it in the console: 
App.last.clone_ids 
-> [2,5,7,26] 

Самой большой проблемой здесь думает, что таблица будет иметь ряд с один столбец держит массив. Это не нормализуется! Обычные ассоциации работают с использованием внешних ключей, как видно из этих примеров, по одному в строке. Если у вас есть сложное отношение has_and_belongs_to_many, таблица, содержащая ключи, имеет два столбца, каждый с одним идентификатором.

Per запроса в комментариях ниже (автообъединение обновления):

def clone_me 
    self.clones << self.clone 
end 

> new_cloned_app = App.last.clone_me 

Ссылка для использования has_many найден: In the rails guide here. Не стесняйтесь использовать другую вспомогательную функцию. Кроме того, возвращаемое значение должно быть .save ed

+0

Когда вы пишете: # Это не в определении класса, куда он идет? – Bob

+1

Я переместил комментарий туда, где он должен был быть. Первоначально я собирался создать метод, который выполнял функцию, но как только я написал комментарий, я понял, что это должно было быть в модели. Я думал, что убрал его, хороший улов. –

+0

Большое спасибо. Последнее, чего я не совсем понял, как создать клон? Я вызываю create и pass в parent_app_id? – Bob

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