设置一个&has -many对象来携带它的父ID

时间:2015-09-23 04:31:23

标签: ruby-on-rails model has-many belongs-to

我有一个名为tag的对象has_many :tweetstweet也有相应的belongs_to

如果我要生成推文以保存在tag模型中,请执行以下操作:

        new_tweet = Tweet.new

        new_tweet.favorite_count = tweet.favorite_count 
        new_tweet.filter_level = tweet.filter_level 
        new_tweet.retweet_count = tweet.retweet_count 
        new_tweet.text = tweet.text 
        new_tweet.tweeted_at = tweet.created_at 

        new_tweet.created_at = DateTime.strptime tweet.created_at.to_s, '%Y-%m-%d %H:%M:%S %z' 

        new_tweet.save 

如何将tweets parent设置为当前标记?我会这样做吗?

new_tweet.tag = self

我尝试了这个并且它没有用,有什么更好的解决方案吗?谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

尝试使用关联创建推文的新对象,tag_id将自动在您的新推文对象中进行分配。因此,将Tweet.new更改为self.tweets.new即可完成。

new_tweet = self.tweets.new

new_tweet.favorite_count = tweet.favorite_count 
new_tweet.filter_level = tweet.filter_level 
new_tweet.retweet_count = tweet.retweet_count 
new_tweet.text = tweet.text 
new_tweet.tweeted_at = tweet.created_at 

new_tweet.created_at = DateTime.strptime tweet.created_at.to_s, '%Y-%m-%d %H:%M:%S %z' 

new_tweet.save 

根据你的评论。您还有数据库结构问题。你需要先解决这个问题。 假设您使用标记名称列,则tag_id表中没有tweets。为了使我的代码正常工作并创建正确的父子关系,您必须在子表中使用parent_id。

请尝试在tag_id表格中添加tweets,您的错误就会消失。您的价值也会妥善保存。

答案 1 :(得分:0)

我说你有两个解决方案:

1)根据pavan的建议,将原始推文的tag_id分配给新标签。这将创建new_tweet与标记之间的关联:

new_tweet.tag_id = tweet.tag_id

2)或者,如果你在标签实例方法中创建new_tweet,你可以按照Dipak的建议通过关联直接创建推文:

new_tweet = self.tweets.build

答案 2 :(得分:0)

我认为有更好的方法。

如果您要保存tag对象,为什么不使用after_create挂钩发送另一条推文?你基本上是在复制所有数据......

例如:

#app/models/tag.rb
class Tag < ActiveRecord::Base
    has_many :tweets
    attr_accessor :parent
    #This will allow you to save a tag with attribute "parent" as true. If true, the tweet model will create another tweet. It will need tweaking
end

#app/models/tweet.rb
class Tweet < ActiveRecord::Base
   belongs_to :tag
   after_create :new_tweet, if: Proc.new { |tweet| tweet.tag.parent }

   def new_tweet
      new = self.clone
      new.tweeted_at = self.created_at
      new.created_at = DateTime.strptime self.created_at.to_s, '%Y-%m-%d %H:%M:%S %z' 
      new.save
   end
end

您可以在此处详细了解Rails' clone method

-

<强>关系

Rails实际上非常适合处理关系数据。

Pavan在评论中几乎是他的建议使用tag_id。当然,这将加载数据库属性,但有更好的方法。

可以看到here,有许多方法添加了has_many/belongs_to关系:

enter image description here

enter image description here

这意味着您将能够使用以下内容:

  • tweet.tag检索标记对象。

  • 如果tweet有多个tag,您就可以使用tweet.tagtweet.tag_id

所有这些意味着您可以将对象传递到new_tweet.tag属性...

因此,你的回答:

new_tweet.tag = tweet.tag