簡體   English   中英

Rails 3使用多個關聯保存

[英]Rails 3 Saving with Multiple Associations

我正在構建一個帶有工作板的Rails 3應用程序,工作人員可以在其中提交工作投標。 我有以下協會:

Job:
  has_many :bids
  has_many :workers, :through => :bid

Bid:
  belongs_to :job
  belongs_to :worker

Worker:
  has_many :bids
  has_many :jobs, :through => :bid

我在“顯示工作”頁面上有一個表單,工作人員可以在其中提交出價。 在控制器中,我有以下內容:

Job Controller:
  def show
    @bid = current_worker.bids.build
  end   

Bid Controller:
  def create
    @bid = current_worker.bids.build(params[:bid])
    @bid.save
  end

使用上面的代碼,提交的出價將無法正確保存,因為它缺少job_id:

1)使用job_id和worker_id保存出價的正確方法是什么?

2)(我無法將job_id從作業控制器show方法傳遞給Bid Controller創建方法) - 在會話變量中傳遞job_id是否安全?

作為參考,出價表格如下:

<%= form_for(@bid) do |f| %>

  <%= f.label :min_price, "Minimum Price" %>
  <%= f.text_field :min_price %>

  <%= f.label :fee %>
  <%= f.text_field :fee %>

  <%= f.label :comments %>
  <%= f.text_area :comments, placeholder: "Comments..." %>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

代碼取決於您想要的安全性,我想您希望獲得current_worker無法出價的受保護作業,因此您需要這似乎不依賴於出價,而是取決於工作。

在您首次創建出價時,您可以在表單中或作為路徑的一部分傳遞job_id。

如果你想拒絕一個工人競標任何工作你可以做這樣的事情:

Bids Controller:

  def create
    job = Job.find(params[:job_id])
    if current_worker.can_bid? job
      @bid = current_worker.bids.build params[:bid]
    else
      # handle unauthorised bidding

在工人模型中,這只是一個例子:

def can_bid?(job)
  # Implement code here
  # example:
  # job.public? or invited_to?(job)
end

# example of invited_to?(job)
def invited_to?(job)
  job.invitees.include? self
end

我不確定這是否能回答你的問題。

我想你可以用它來傳遞路線中的工作ID:

路線

resources :jobs do
  resources :bids
end

視圖

= form_for @job, @bid ...

與第一次沒有@job一樣,您可以使用:

= form_for :job, @bid

我是鐵桿新手,但我想而不是說

<%= form_for(@bid) do |f| %>

嘗試

<%= form_for(@job, @bid) do |f| %>

然后在您的出價控制器中,新操作會執行此類操作

def new
  @job = Job.find(params[:job_id])
  @bid = @job.bids.build
end

然后在您的路線中,您應該將出價嵌套在作業資源之下

resources :jobs do
  resources :bids
end

應該這樣做我希望,就像我說我是一個新手,可能是錯的。

只需檢查您的型號出價。 它與兩個型號相似。 所以你必須把它作為多態表。 重新構建模型如下

Bid:
  belongs_to :bidable, polymorphic: true

Job:
  has_many :workers, :through => :bid
  has_many :bids, :as => :bidable

Worker:
  has_many :bids, :as => :bidable
  has_many :jobs, :through => :bid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM