你如何将一个模型与另一个模型相关联?

时间:2014-10-02 11:48:23

标签: ruby-on-rails activerecord database-design

我有一个名为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.如果它没有添加它。 如果确实如此,就什么都不做。

我不明白这两个模型是如何连接在一起的,以及我如何从模型中访问记录。

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