我有一个名为tag
的对象has_many :tweets
。 tweet
也有相应的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
我尝试了这个并且它没有用,有什么更好的解决方案吗?谢谢你的帮助。
答案 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
关系:
这意味着您将能够使用以下内容:
tweet.tag
检索标记对象。
如果tweet
有多个tag
,您就可以使用tweet.tag
或
tweet.tag_id
所有这些意味着您可以将对象传递到new_tweet.tag
属性...
因此,你的回答:
new_tweet.tag = tweet.tag