我正在使用postgres db的rails应用程序。我有一个名为merchant_review_votes的表,其中schema是
-------------------------------------------------- id | integer user_id | integer merchant_review_id | integer value | integer created_at | timestamp without time zone updated_at | timestamp without time zone --------------------------------------------------
我正在创建一个涉及投票的另一个部分(比如产品)是一个好主意,创建一个类似于此的另一个模式或修改代码并只使用一个表。 如果只有一个表,架构将如何看?我可以面对什么样的问题..
答案 0 :(得分:1)
如果两个评论都包含完全相同的信息,那么我会选择一个包含“review_type”列的表。对于商店评论,该列将包含产品评论的“商店”,该列将包含“产品”。
但我错过了对表定义中审核的存储的引用。如果您需要(很可能,否则您不知道评论所属的商店或产品),您最好有两张桌子。一个带有商店表的外键,一个带有产品表的外键。
答案 1 :(得分:0)
对于Polymorphic Association来说,这听起来很合适。
class Review < ActiveRecord::Base
belongs_to :user
belongs_to :reviewable, :polymorphic => true
end
class Merchant < ActiveRecord::Base
has_many :reviews, :as => :reviewable
end
class Product < ActiveRecord::Base
has_many :reviews, :as => :reviewable
end
然后,您可以分别致电@merchant.reviews
和@product.reviews
以获取商家和产品的评论。您可以调用@review.reviewable
来获取已审核的对象。
多态关联基于如下的表结构:
--------------------------------------------------
id | integer
user_id | integer
reviewable_id | integer
reviewable_type | string
value | integer
created_at | timestamp without time zone
updated_at | timestamp without time zone
--------------------------------------------------
reviewable_type
列包含&#34;可审核的&#34;的类名。对象和reviewable_id
拥有它的ID。在迁移中,您可以使用以下命令创建这些列:
t.references :reviewable, :polymorphic => true
答案 2 :(得分:0)
对于SO来说,这可能过于开放了,但在这里;我的看法:它取决于它!
有时它是有道理的。我不是全球笔记表的粉丝。
一般来说,我认为值得避免这种情况,但是当你必须这样做时,让两个表继承一个没有记录的共同基础可以大大简化管理。