【问题标题】:How to get serialized attribute in rails?如何在rails中获取序列化属性?
【发布时间】:2017-10-09 06:06:23
【问题描述】:

我已经序列化了 Post 模型的列

serialize :user_ids 

保存后我可以在控制台中看到:

> p = Post.last

 => #<Post id: 30, title: "almost done2", created_at: "2017-05-08 15:09:40", updated_at: "2017-05-08 15:09:40", attachment: "LOGO_white.jpg", user_ids: [1, 2]> 

我已经在我的控制器上允许了参数 :user_ids

def post_params
  params.require(:post).permit(:title, :attachment, :user_ids)
end

我只需要存储@user_ids 并作为属性复制到其他模型, 但无法获得像@user_ids = @Post.last.user_ids这样的实例

得到错误

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.post_id: SELECT "users".id FROM "users" WHERE "users"."post_id" = ?

感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails serialization sqlite model


    【解决方案1】:

    不幸的是,我认为您为序列化属性选择了非常错误的名称!

    看,Rails 试图提供帮助,relation_ids 方法允许您调用所有相关对象的 id。考虑这两个模型

    class User
      belongs_to :post
    end
    
    class Post
      has_many :users
    end
    

    你可以这样称呼

    Post.last.user_ids
    

    然后它将尝试找到属于该帖子的所有用户并返回他们的 ID。

    看看你得到的查询:

    SELECT "users".id FROM "users" WHERE "users"."post_id" = ?

    这正是 Rails 想要做的。选择属于该帖子的用户并为您提供他们的 ID。但是用户没有 post_id 列,所以这失败了。

    最好将序列化列的名称更改为不会混淆 Rails 的名称。但是,如果您想保留您的列,您可以通过将其放在 Post 模型上来覆盖该方法

      def user_ids
        self[:user_ids]
      end
    

    然而,这并不理想,但会让您决定要做什么。我的偏好是列重命名,真的。会省去很多麻烦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多