还是一个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
答案 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
“,那就没问题了。但除此之外,我只看到它阻碍了理解。