【问题标题】:How to create an ActiveRecord model with some attributes that are stored in the database and some that are read from Facebook如何创建一个 ActiveRecord 模型,其中一些属性存储在数据库中,一些属性从 Facebook 读取
【发布时间】:2012-07-24 09:52:50
【问题描述】:

在我的应用程序中,我有一个用户对象模型。我正在使用 koala 和 OmniAuth 访问 Facebook。

我试图弄清楚如何将 Facebook 中的数据添加到我的模型中,以便我的控制器正确序列化它。

我已经设法在我的控制器中从 Facebook 获取数据:

token = request.env["omniauth.auth"]["credentials"]["token"]
api = Koala::Facebook::API.new(token)
api.get_object("me")

我想我想出了如何在没有 DB 列的情况下将属性添加到我的模型中,但以一种将其保留在序列化响应中的方式:

def fb_info
  {"fb_info" =>"should be here"}
end

def attributes
  super.merge('fb_info' => fb_info)
end

那么,将它们组合在一起的首选方式是什么?我需要以某种方式在我的模型中填充属性。为了做到这一点,我需要那里的访问令牌。从控制器调用以填充它们或将令牌传递给模型似乎很麻烦。有没有干净的方法来处理这个?

【问题讨论】:

    标签: ruby-on-rails facebook ruby-on-rails-3 activerecord activemodel


    【解决方案1】:

    将 setter 方法添加到您的模型中,并在此方法中执行所有数据转换。在大多数情况下,您可以将数据从控制器传递给 setter 方法,就像使用任何“真实”属性一样。但是要将这些数据存储到数据库中,您应该自己处理。

    def virtual_column_name=(raw_data)
      # some code to handle raw_data and put it into database
    end
    

    【讨论】:

    • 它看起来确实简单明了。我对这种方法的唯一问题是让控制器负责在模型中填充数据(也在控制器应该读取数据的流中)。我不确定这是否是最佳做法。此外,当渲染一个对象列表(例如)时,它会强制循环遍历控制器中的所有模型对象,这似乎是控制器中与模型相关的代码过多。
    • 是的,控制器应该尽可能简单。如果控制器代码太复杂,请考虑将此代码的某些部分移至模型,甚至移至单独的库中。有时rails_best_practicesgem 可以给你一个提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多