1

我正在努力理解必须的关系owner = create(:user, device_token: device_token)owner: {device_token: device_token}我通常user_id用于这种关联。2.device_token控制器中的方法在做什么。

describe 'POST /v1/events' do
   it 'saves the address, lat, lon, name, and started_at date' do
     date = Time.zone.now
     device_token = '123abcd456xyz'
     owner = create(:user, device_token: device_token)

     post '/v1/events', {
       address: '123 Example St.',
       ended_at: date,
       lat: 1.0,
       lon: 1.0,
       name: 'Fun Place!!',
       started_at: date,
       owner: {
         device_token: device_token
       }
      }.to_json, { 'Content-Type' => 'application/json' }

      event = Event.last
        expect(response_json).to eq({ 'id' => event.id })
        expect(event.address).to eq '123 Example St.'
        expect(event.ended_at.to_i).to eq date.to_i
        expect(event.lat).to eq 1.0
        expect(event.lon).to eq 1.0
        expect(event.name).to eq 'Fun Place!!'
        expect(event.started_at.to_i).to eq date.to_i
        expect(event.owner).to eq owner
  end

结尾

控制器代码:

def create
  @event = Event.new(event_params)

  if @event.save
    render
  end
end


private

  def event_params
    {
      address: params[:address],
      ended_at: params[:ended_at],
      lat: params[:lat],
      lon: params[:lon],
      name: params[:name],
      started_at: params[:started_at],
      owner: user
    }
  end

  def user
    User.find_or_create_by(device_token: device_token)
  end

  def device_token
    params[:owner].try(:[], :device_token)
  end
end
4

1 回答 1

0

您可以通过多种方式来唯一标识数据库中的记录。使用该id字段是最常见的 - 但如果您有另一种唯一标识用户的方法,那么您也可以使用它。通常,您不会向用户显示他们在数据库中的 ID 号。但是,如果您想为他们提供一种唯一标识自己的方式,您可以创建另一个对每个用户都是唯一的字段 - 例如 amembership_number或类似的。在您的情况下,似乎device_token是一个唯一标识用户的字段。

因此,您的数据库关心该user_id字段 - 这就是它用于将 an 绑定Event到特定User(也就是所有者)的内容。如果您的用户知道他们的 id,那么他们可以传入那个,而不是他们的device_token,一切都会好起来的。但他们不知道。

所以,他们通过他们的devise_token. 您使用它从数据库中获取用户,然后您知道该用户的 ID。然后,您可以将该用户的 ID 存储在模型的user_id字段中Event

def user
  User.find_or_create_by(device_token: device_token)
end

此方法是基于devise_token. 然后这个方法:

def event_params
  {
    address: params[:address],
    ended_at: params[:ended_at],
    lat: params[:lat],
    lon: params[:lon],
    name: params[:name],
    started_at: params[:started_at],
    owner: user
  }
end

特别是,这行:owner: user调用上面的那个方法。从那时起,Rails 会在后台处理它并确保您的 user_id 设置正确。

评论后更新:

device_token作为参数传入。它也是 User 模型中字段的名称。因此,用户表中的一行可能如下所示:

id: 24, first_name: fred, last_name: flintstone, device_token: 123abc, address: 基岩等。

方法:

def user
  User.find_or_create_by(device_token: device_token)
end

就是说:去数据库中的用户表,尝试找到一个用户,该用户具有device_token作为参数传入的值,如果找不到,则创建一个。

所以在这一行:User.find_or_create_by(device_token: device_token)中,第一个引用device_token是哈希的键,它引用了device_token在你的用户模型中调用的字段。

第二个引用device_token是对该方法的调用:

def device_token
  params[:owner].try(:[], :device_token)
end

device_token从传入的参数中获取。这个方法基本上说:在参数哈希中查看owner键内的值。查看owner密钥是否包含device_token. 如果是,则返回 that device_token,如果不返回nil。它使用该try方法执行此操作,您可以在此处阅读更多信息:http: //apidock.com/rails/Object/try

于 2014-11-09T22:34:15.700 回答