如何将克隆与Rails中的父级相关联?

时间:2015-12-06 16:11:36

标签: ruby-on-rails ruby-on-rails-4

我有一个说应用程序的模型,每个应用程序包含一堆用户,以及对商店类型的引用,并具有属性,名称,app_id,版本和价格。

我希望能够创建此应用程序的克隆,它具有所有相同的值,除了版本和商店类型。

我想通过向我的应用添加一个名为" Is_clone"的属性/列来实现此目的,并且我想要一个名为AppToClone的第二个表,它有两列App和克隆。 在每一行中,我都会说App:1,Clone:[2,5,7,26]

这样我就可以将每个克隆编辑为自己的应用程序,但同时我可以将应用程序中的任何更改应用于其所有克隆。

我已经为AppToClone设置了数据库,但我仍然坚持如何在App Model本身中创建这种关联。到目前为止我发现的例子如gem rails_lookup_tables似乎只允许单个值而不是AppToClone表中的数组。

目前在我的App模型中,我有以下几行: :has_many :apps, through: :appstoclones 但这对我来说并不合适,而且我不确定如何随着时间的推移构建该数据库。

感觉有点愚蠢,但我被卡住了。

2 个答案:

答案 0 :(得分:1)

因此,has_many和belongs_to关联以与问题指示不同的方式存储数据。我会使用单表继承,从App模型继承Clone模型。

class App < ActiveRecord::Base
  has_many :clones
end

class Clone < App
  belongs_to :app
end

您需要在app表上输入app_id并输入(我知道很奇怪),因此您的克隆可以关联。那么你能做的就是将你的克隆作为App查询。

Clone.last.is_a? App
-> true

我认为最接近你真正想要的东西,在Ruby on Rails指南的2.10 Self Joins部分中有概述。

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关系,那么持有键的表有两列,每列有一个id。

根据以下评论中的请求(自我加入更新):

def clone_me
  self.clones << self.clone
end

> new_cloned_app = App.last.clone_me

找到使用has_many的参考:In the rails guide here。随意使用不同的辅助功能。此外,返回的值必须为.save ed

答案 1 :(得分:0)

我会说你正在寻找一个有许多所属关系

对于has-many部分:http://guides.rubyonrails.org/association_basics.html#the-has-many-association

对于所属部分:http://guides.rubyonrails.org/association_basics.html#the-belongs-to-association

一个模型是应用,另一个克隆,其中克隆表将存储应用具有的相同字段,以及其他所需的字段克隆实例。通过从继承自ActiveRecord的应用程序模型继承克隆模型,可以在使用应用程序的代码中使用克隆。