我有一个名为Topic的模型,另一个名为Product。
这是主题模型的外观,
class Topic < ActiveRecord::Base
belongs_to :product
end
主题有专栏&#34;标题&#34;和&#34;身体&#34;。
这是产品,
class Product < ActiveRecord::Base
has_many :topics
end
产品有专栏&#34;名称&#34;和&#34; desc&#34;。名字是唯一的。
当我创建一个新的主题时,我希望主题的标题存储在产品名称中,只有当Name还不存在时。如果是的话,它不应该做任何改变。
但我该怎么做?
更新:
用户进入/主题页面,输入标题和正文。
Topics_controller应该做什么, 1.阅读用户提供的标题。 2.检查产品中是否已存在该标题。 3.如果它没有添加它。 如果确实如此,就什么都不做。
我不明白这两个模型是如何连接在一起的,以及我如何从模型中访问记录。
答案 0 :(得分:2)
您可以使用ActiveRecord提供的callbacks之一来实现此目的。
我不确定我是否完全理解您的要求,所以您可能需要更改以下示例:
class Topic < ActiveRecord::Base
belongs_to :product
before_save :add_product_name
private
def add_product_name
self.product.name ||= self.title if Product.find_by(name: self.title).nil?
end
end
答案 1 :(得分:0)
您可以编写类似before_create的回调:add_topic_name
该方法将找到主题的产品名称并将其分配给产品标题。
答案 2 :(得分:0)
您的要求在这里有点不清楚。从行为的角度来看,您能指定您的最终目标吗?
如果我理解正确,为什么不覆盖主题的标题方法。这样就不会在数据库中复制数据了。
在您的主题课程中:
class Topic < ActiveRecord::Base
def title
read_attribute(:title) || product.name # will get title of @topic if not nil, else product name
end
end