如何从Rails中的第二个表中排除记录?

时间:2018-04-23 19:31:45

标签: ruby-on-rails activerecord

还是一个Rails新手。代码会很棒,但也有关于搜索什么/在哪里学习我需要什么的建议,因为我确定答案就在那里,但我不确定我应该搜索什么。

我正在尝试创建类似于taskrabbit或upwork的网站,其中成员可以发布作业,而工作人员可以提交作业的出价。我遇到的问题是当一个人竞标工作时,我不希望这份工作出现在工人可以竞标的工作列表中。

我有两个表,一个“工作”表和一个“出价”表。这些表都有一个“job_id”字段。出价表有一个worker_id字段,该字段是在作业上提交出价的工人的ID。我想要的是获得一个不包含具有特定worker_id的出价的工作的结果集。

模型如下:

class Worker < ApplicationRecord
  has_many :bids
end

class Bid < ApplicationRecord
  belongs_to :job
  belongs_to :worker
end

class Job < ApplicationRecord
  has_many :bids
end

3 个答案:

答案 0 :(得分:0)

制作一个范围。用户无法查看所有作业,他们只能看到available_jobs

然后为他们定义。 available_jobs = Job.where.not(Bid.where(user_id: current_user.id).select(job_id))

或更合乎逻辑的东西。设置范围将是一个更好的解决方案。

答案 1 :(得分:0)

尝试这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<VAST version="2.0">
  <Ad id="TestAd">
    <InLine>
     <AdSystem>...</AdSystem>
     <AdTitle>VAST 2.0 Linear Ad</AdTitle>
     <Impression></Impression>
     <Creatives>
        <MediaFile ...
     </Creatives>
   </InLine>
 </Ad>
</VAST>

如果已经出价,我就不会显示为链接(我认为!)

或者您可以显示该作业,如果current_user已经出价,您可以链接以显示他的出价而不是出价/新到您是否要允许此人更改出价。

答案 2 :(得分:0)

也许您可以将Worker更改为包含jobs,如下所示:

class Worker < ApplicationRecord
  has_many :bids
  has_many :jobs, through: :bids
end

然后,要获取jobs尚未出价的所有worker

Job.where.not(id: @worker.jobs)

正如David Weber所说,你可以在Job上创建一个方法,例如:

class Job < ApplicationRecord
  has_many :bids

  class << self

    def available_for(worker)
      where.not(id: worker.jobs)
    end

  end
end

在这种情况下,你会使用类似的东西:

Job.available_for(@worker)
事实上David Weber说你可以成为scope。我会注意到official Rails guide个州:

  

使用类方法是接受范围参数的首选方法。

您可以将该类方法编写为:

class Job < ApplicationRecord
  has_many :bids

  def self.available_for(worker)
    where.not(id: worker.jobs)
  end

end

对于哪种方式更好,有一些不同的意见。我认为这是个人偏好的问题。

我还要注意Jörg W Mittag希望陈述:

  

我是Ruby Purists之一,他们喜欢指出Ruby中没有类方法。但是,我完全没问题,通常使用术语类方法 ,只要所有各方都完全理解这是一种口语用法。换句话说,如果您知道没有类方法这样的东西,并且术语“类方法”只是“作为实例的对象的单例类的实例方法”的缩写Class“,那就没问题了。但除此之外,我只看到它阻碍了理解。