Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 5可以在会话中的任何位置访问配置文件数据,而无需每次查询数据库_Ruby On Rails_Forms_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails Rails 5可以在会话中的任何位置访问配置文件数据,而无需每次查询数据库

Ruby on rails Rails 5可以在会话中的任何位置访问配置文件数据,而无需每次查询数据库,ruby-on-rails,forms,ruby-on-rails-5,Ruby On Rails,Forms,Ruby On Rails 5,我有一个在用户创建(使用Desive)后创建的用户配置文件(带有名称、徽标、关于我)。配置文件表使用用户id作为主键 现在,我希望每当用户创建/更新帖子时,在填写表单时,从概要文件中获取一些详细信息,因此概要文件数据或@profile在帖子表单中可用,因为我无法在表单中公开我的模型。 要在create and#update中设置post.myname属性,我将执行以下操作: @myprofile = Profile.find_by_user_id(current_user) write_attr

我有一个在用户创建(使用Desive)后创建的用户配置文件(带有名称、徽标、关于我)。配置文件表使用用户id作为主键

现在,我希望每当用户创建/更新帖子时,在填写表单时,从概要文件中获取一些详细信息,因此概要文件数据或@profile在帖子表单中可用,因为我无法在表单中公开我的模型。 要在create and#update中设置post.myname属性,我将执行以下操作:

@myprofile = Profile.find_by_user_id(current_user)
write_attribute(:myname, @myprofile.name)
我阅读了各种来源的资料,但在给出的4个解决方案中,最好的解决方案是什么?如果有人可以使用简单的代码,因为我不想做一些广泛的事情?提前谢谢

1) 表单隐藏字段-如上面在#编辑中以哈希方式获取配置文件数据,然后在#更新中传递表单和访问字段,但这样我们将分别传递每个字段。是否可以传递一个@myprofile

2) 会话-我觉得如果配置文件数据存储在会话中,并且有人更新了配置文件,那么更新的数据在该会话中将不可用。所以不确定它是否合理

3) 缓存-实现这一点的简单方法


4) 多态配置文件——尝试过,但没有得到相关的示例。我一直在思考什么是可分析的id和类型,以及如何在代码中使用它们。

如果您的配置文件和用户模型彼此之间存在一对一的关系,最简单的解决方案是完全删除配置文件模型,并将其字段移动到用户模型中

Desive已查询数据库以获取
当前用户
对象。因此,您的示例如下所示:

write_attribute(:myname, current_user.name)
它不会命中数据库(在Desive检索到
当前用户
对象之后)


如果您被迫保留配置文件模型,在查看您的四个场景时

  • 您可以使用会话变量。比如:

    session[:profile_name] ||= @myprofile.name
    
    这将发生在控制器操作中

    这里的技巧是,如果概要文件得到更新,您将需要重新定义每个相关会话变量。因为您没有访问模型中会话的权限,所以最好在控制器中执行该操作。所以,不漂亮,但它可以工作

  • 您还可以使用低级缓存,并在用户上保存配置文件关系。通常,在用户模型中可以有如下方法:

    def profile_cached
      Rails.cache.fetch(['Profile', profile.id]) do
        profile
      end
    end
    
    在这里,您也必须知道缓存何时过期。这种方法的好处是,您可以将此代码放入模型中,这意味着您可以在回调中钩住它的过期时间

    请在中阅读更多关于此的信息


  • 我会避免隐藏字段,我不确定多态关系如何解决不命中数据库的问题。所以,#2和#3是选项,但如果你能将两个模型合并为一个,那应该会简化它。

    Thx,@seancdavis。我首先决定在用户表中包含所有配置文件细节,但用户表变得复杂,我不想干扰designe表。关于你回答中的选项2,我有两个问题:首先,如果我更新配置文件,如何确保会话“立即”更新?其次,profilescontroller#create中是否包含此会话代码?请注意,会话是在用户注册或登录后立即创建的,但用户创建中可能不存在配置文件&因此,我无法将会话代码放入SessionControllery。您不太可能通过几个简单的配置文件字段干扰Desive。但无论如何,我在我的回答中添加了一些细节来回答你的两个问题。