设置一个 'has_many' 的对象来携带它的父 ID

Setting a 'has_many's object to carry it's parent id

我有一个名为 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 

如何将推文父级设置为当前标签?我会做这样的事情吗?

new_tweet.tag = self

我试过了,但没有用,有什么更好的解决方案吗?谢谢你的帮助。

尝试使用关联创建推文的新 object,tag_id 将自动分配到您的新推文 object 中。因此,将 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 

根据您的评论。您还有数据库结构问题。你需要先解决这个问题。 假设您使用标签名称列,您的 tweets table 中没有 tag_id。为了使我的代码正常工作并创建适当的 parent child 关系,您必须在 child table.

中包含 parent_id

因此请尝试在 tweets table 中添加 tag_id,您的错误就会消失。您的价值也将正确保存。

我会说你有两个解决方案:

1) 按照 pavan 的建议,将原始推文的 tag_id 分配给新标签。这将在 new_tweet 和标签 :

之间创建关联
new_tweet.tag_id = tweet.tag_id

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

new_tweet = self.tweets.build

我认为有更好的方法。

如果您要保存一个 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关系:

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

  • tweet.tag 检索标签对象。

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

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

因此,您的答案:

new_tweet.tag = tweet.tag