rails 4模型关联左连接验证id

时间:2016-03-04 22:55:01

标签: ruby-on-rails ruby model-view-controller activerecord

我一直在争论这个,我想创建一个LEFT加入条件,所以我有一个优惠券模型,用户可以创建优惠券,但是当他们被分配时,他们可能会或可能不会被分配到工作他们被认为是执行。我在优惠券模型上将此设置设为has_one :job并带有add_reference :jobs, :coupon, index: true索引,但这看起来很糟糕。我认为我的大脑今天已被炒了......如果使用优惠券,我最好确认它被分配到有效的工作,这就是我使用索引的原因。

class CreateCoupons < ActiveRecord::Migration
  def change
    create_table :coupons do |t|
      t.string :code, limit: 250, null: false
      t.datetime :start_at, null: false
      t.datetime :end_at, null: false
      t.datetime :executed_at
      t.datetime :deleted_at
      t.timestamps null: false
    end

    add_reference :jobs, :coupon, index: true
    add_index :coupons, :deleted_at
    add_index :coupons, :code, unique: true
  end
end

class CreateJobs < ActiveRecord::Migration
  def change
    create_table :jobs do |t|
      t.string :title, limit: 50, null: false
      t.string :slug, limit: 250, null: false
      t.string :location, limit: 100, null: false
      t.string :short_description, limit: 250, null: false
      t.text   :description, null: false
      t.text   :application_process, null: false
      t.boolean :is_featured, default: false
      t.datetime :start_at
      t.datetime :end_at

      t.timestamps null: false
    end

    add_index :jobs, :slug
  end
end

模型类......

class Coupon < ActiveRecord::Base
  has_one :job
end

class Job < ActiveRecord::Base
  belongs_to :coupon
end

1 个答案:

答案 0 :(得分:0)

首先我要说的是,你目前所拥有的并没有什么问题,而且实际上你的问题并不清楚。

我实际上会以相反的方式对此进行建模,job_id表上有coupons,即:

add_reference :coupons, :job, index:true

和...

class Coupon < ActiveRecord:Base
  belongs_to :job
end

最大的优势在于,如果job_idNULL,那么你可以知道你的优惠券是否被执行,如果jobscoupon_id那么它没有被执行 - 而你现在如何拥有它您需要在executed?表上实际执行SELECT,以确定是否有记录def executed? job_id.present? end

您的$(document).ready( function() { $("#citybox").hide(); $("#statebox").hide(); $('input#zip').bind("change keyup input",function() { var zip_in = $(this); var zip_box = $('#zipbox'); if (zip_in.val().length<5) { zip_box.removeClass('has-error has-success'); } else if ( zip_in.val().length>5) { zip_box.addClass('has-error').removeClass('has-success'); } else if ((zip_in.val().length == 5) ) { var urls =["https://api.zippopotam.us/us/" ,"https://api.zippopotam.us/pr/","https://api.zippopotam.us/vi/"]; $.each(urls, function(i,u){ $.ajax(u + zip_in.val(),{ cache: false, dataType: 'json', type: 'GET', success: function(result, success) { // Make the city and state boxes visible $('#citybox').slideDown(); $('#statebox').slideDown(); // US Zip Code Records Officially Map to only 1 Primary Location for abbreviation places = result['places'][0]; $('#city').val(places['place name']); $('#state').val(places['state']); zip_box.addClass('has-success').removeClass('has-error'); }, error: function(result, success) { zip_box.removeClass('has-success').addClass('has-error'); } }); }); } }); }); 方法会变成:

{{1}}