【问题标题】:How to initialize record from session variable in rails so that we need not to execute query for initializing a record?如何从 Rails 中的会话变量初始化记录,以便我们不需要执行查询来初始化记录?
【发布时间】:2016-01-12 01:09:45
【问题描述】:

有什么方法可以从会话中初始化记录。例如,我有一个组织对象,我把它放在会话对象中,比如

session[:organization] = organization

现在我做了一个自定义方法current_organization(我知道设计) 喜欢

def current_organization
 Organization.new(session[:organization])
end

这将返回组织对象。我的 organization belongs_to team 一个设计模型和 team has_many :organizations 但是当我打电话时

current_team.organizations.includes?(current_organization)

在视图中。即使它包含在团队的组织中但这样做也会返回错误

current_team.organizations.reload.includes?(current_organization)

正在返回 true。在调用我使用上述方法的视图之前,我使用组织对象设置了会话变量。是否有任何我错过的事情,比如我无法弄清楚即使包含在内也不返回 true 的原因?

【问题讨论】:

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


    【解决方案1】:

    先尝试保存记录。

    在您将其保存到数据库之前,当您查询团队的组织子级时,它可能不会显示。

    session[:organization_id] = organization.id
    
    def current_organization
        Organization.find session[:organization_id]
    end
    

    【讨论】:

    • 实际上记录已经保存,我确实提取了组织记录并尝试保存在会话变量中。我的问题是关于重新加载为什么它返回 true
    • 在这种情况下仅存储组织 ID,然后调用该记录。我会更新我的答案
    • 没有我的 current_organization 方法在每次操作之前都会被调用,我不想一次又一次地调用该记录
    • 您是否考虑过在名为“current_organization”的团队模型中编写一个动态方法,该方法使用一些数据库逻辑来提取您认为是 current_organization 的内容,并避免出现在所有人前面的 before_filter/before_action你的行为?让我试试看
    • 据我所知,如果不查询实际的 Active Record 对象是不可能的。也许最合适的是重新访问设计?
    【解决方案2】:

    好吧,经过一番谷歌搜索后,我发现不是使用

    Organization.new(session[:organization])
    

    我应该使用

    Organization.instantiate(session[:organization])
    

    apidock我发现

    实例化(属性,column_types = {})公共

    给定一个属性哈希,实例化返回一个新的实例 适当的班级。只接受键作为字符串。

    例如,Post.all 可能会通过以下方式返回评论、消息和电子邮件 将记录的子类存储在类型属性中。通过调用 实例化而不是新的,查找器方法确保它们得到新的 每个记录的相应类的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多