我有一个说应用程序的模型,每个应用程序包含一堆用户,以及对商店类型的引用,并具有属性,名称,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
但这对我来说并不合适,而且我不确定如何随着时间的推移构建该数据库。
感觉有点愚蠢,但我被卡住了。
答案 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的应用程序模型继承克隆模型,可以在使用应用程序的代码中使用克隆。