【问题标题】:A clean way to update attributes across objects?一种跨对象更新属性的干净方法?
【发布时间】:2011-06-24 06:57:15
【问题描述】:

我想做这样的事情:

鉴于:

@user1
@user2

Post 模型的位置 (id, user_id)

@posts = @user1.posts

我想获取user1的所有帖子,并将user_id设置为@user2

有没有一种简单的方法可以做到这一点?还是我必须遍历所有@posts 并更新属性并保存记录?

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    您可以在 Post 类上使用类方法 update_all 来完成此操作。传递的第一个字符串本质上是 SQL 更新语句的 SET 子句,第二个字符串是 WHERE 子句。

    Post.update_all("user_id = #{@user2.id}", "user_id = #{@user1.id}")
    

    【讨论】:

    • +1 我也喜欢你的回答,但我尽量不要直接写 sql。
    【解决方案2】:

    我为此使用_ids 属性。

    @user2.update_attribute(:post_ids, @user1.post_ids)
    

    更多解释

    如果你输入

    @user1.post_ids # --> [1,2,3,4]
    

    您将在数组中获取用户连接到的所有帖子的所有 ID。

    你也可以这样设置关系

    @user2.post_ids = [1,2] 
    @user2.save
    

    所以,为了解决您的问题,我只是将@user1 的帖子ID 数组分配给@user2 的帖子ID。

    【讨论】:

    • 谢谢,但我没有关注?
    • 我的回答中有一个错字,令人困惑。我也喜欢 KenB 的回答。
    • +1 我喜欢你的回答,因为它是纯粹的 ruby​​esque 性质,我不知道你可以在像 _ids 这样的虚拟属性上运行 update_attribute。好的!但是 Post.update_all 方法在数据库中的效率要高得多,只生成一个更新语句。
    • @KenB - 我同意在数据库方面更好。
    猜你喜欢
    • 2011-09-07
    • 2022-08-11
    • 2015-03-03
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2019-03-08
    • 2017-04-17
    • 2015-10-31
    相关资源
    最近更新 更多