如何在rails中获取序列化属性?

时间:2017-05-10 14:13:33

标签: ruby-on-rails serialization sqlite model

我已经序列化了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]> 

我已经允许params:我的控制器上的user_ids

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

我需要的只是存储@user_ids并将其复制到其他模型作为atrribute, 但无法获得@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" = ?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

请参阅,Rails正在尝试提供帮助,而relation_ids方法允许您调用所有相关对象的ID。考虑这两个模型

class User
  belongs_to :post
end

class Post
  has_many :users
end

你可以打电话给

Post.last.user_ids

然后会尝试查找属于此帖子的所有用户,并将其返回给他们。

查看您获得的查询:

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

这正是Rails正在尝试做的事情。选择属于帖子的USERS并为您提供ID。但是,用户没有post_id列,因此失败。

最好将序列化列的名称更改为不会混淆Rails的内容。但是,如果要保留列,可以通过将其置于Post模型

来覆盖该方法
  def user_ids
    self[:user_ids]
  end

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