设置一个 'has_many' 的对象来携带它的父 ID
Setting a 'has_many's object to carry it's parent id
我有一个名为 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
如何将推文父级设置为当前标签?我会做这样的事情吗?
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.tag
或
tweet.tag_id
所有这些意味着您可以将对象传递给您的 new_tweet.tag
属性...
因此,您的答案:
new_tweet.tag = tweet.tag
我有一个名为 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
如何将推文父级设置为当前标签?我会做这样的事情吗?
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.
因此请尝试在 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.tag
或tweet.tag_id
所有这些意味着您可以将对象传递给您的 new_tweet.tag
属性...
因此,您的答案:
new_tweet.tag = tweet.tag