【问题标题】:Deleting and recreating the same association in rails在 Rails 中删除和重新创建相同的关联
【发布时间】:2017-10-04 19:54:18
【问题描述】:

我有一个通过 devise 创建的用户模型、一个股票模型(通过脚手架生成),因此我可以使用我自己的自定义价格创建一个股票数据库,以及一个用于在两者之间建立关联的 UserStock 模型。在我的 UI 和控制台中,一切似乎都运行良好。

这就是问题所在。 我有一个与我的 _list.html.erb 中配置的按钮相关联的删除方法,该按钮显示用户投资组合中的所有股票。当我第一次删除它时,(从我的投资组合中删除股票)它工作正常。当我再次将股票添加到我的投资组合中时,当然效果很好。但是第二次删除不起作用。 比如说,我的用户 ID 是 1。我的 UserStock 关联在 user_id 1 和 stock_id 1 之间创建了一个关联(比如 ID 为 1 的股票是 Google)。这存储在 UserStock id 1 中。当我删除此关联并重新创建它时,它存储在 UserStock id 2(一个全新的关联)中。但是当我再次尝试删除它时,我无法这样做。我的 Rails 控制台在我的 UserStock 控制器中显示此错误。

这是弹出的错误:Record Not Found in UserStocksController#destroy

  def set_user_stock
   @user_stock= UserStock.find(params[:id])  
  end

编辑:当然,这是我的观点和所需的模型:

            <% if @user.id = current_user.id %>
            <td>
            <%=link_to "Delete", user_stock_path(user_stock), :method 
            => :delete, :data => { :confirm => "Are you sure?" },
            :class => "btn btn-xs btn-danger" %>
            </td>
            <% end %>

用户.rb

     has_many :user_stocks
     has_many :stocks, through: :user_stocks
     def can_add_stock?(ticker_symbol)
       !stock_already_added?(ticker_symbol)
     end

     def stock_already_added?(ticker_symbol)
       stock = Stock.find_by_ticker(ticker_symbol)
       return false unless stock
       user_stocks.where(stock_id: stock.id).exists?
     end

股票.rb

has_many :user_stocks
has_many :users, through: :user_stocks
def self.find_by_ticker(ticker_symbol)
    where(ticker: ticker_symbol).first
end

user_stock.rb

belongs_to :user
belongs_to :stock

【问题讨论】:

  • 您在哪个视图上,该视图的代码是什么样的?我会说你会有一个连接表的控制器是不寻常的。通常,您会为此使用用户控制器之类的东西,并使用@user.user_stocks 找到 UserStock,然后您可以将删除附加到该控制器上。
  • 您需要向我们展示您的观点,以及相关模型,以便我们为您提供帮助。
  • @ruby_newbie 我知道这很不寻常。这只是为了客户的方便(因为这是一个股票交易游戏,他们更容易看到参与者通过这张表跟踪哪些股票)。但它仍然应该工作。我已经更新了上面的代码。
  • "这存储在 UserStock id 1 中。当我删除此关联并重新创建它时,它存储在 UserStock id 2(一个全新的关联)中。"这就是自动递增数据库列的工作方式,每次插入一行时它都会上升。不是行数的计数。
  • 是的,我想通了。然而,问题在于视图中调用了 user_stock。如果我检查 user_stock,它正在检索股票名称、符号、价格和 ID,而不是 user_stock 关联 ID。这就是删除请求不起作用的原因,它正在查询要删除的错误 ID。我该如何解决这个问题?

标签: ruby-on-rails activerecord


【解决方案1】:

如果您尝试遍历用户拥有的股票,您应该从user_stocks 结束而不是stocks 关联开始:

<% @user.user_stocks.each do |user_stock| %>
  <td><%= user_stock.stock.ticker %></td>
  <td><%= user_stock.stock.name %></td>
  <% if @user.id = current_user.id %>
  <td>
    <%= link_to "Delete", user_stock_path(user_stock), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-xs btn-danger" %>
  </td>
  <% end %>
<% end %>

【讨论】:

  • 我在你的 视图中得到了一个'未定义的本地方法或变量 "us"'
  • 嗨最大。我觉得我现在有逻辑了。我认为这是正确的路径,我通过 user_stocks 关联迭代 do 循环。但我收到控制台错误“未定义的方法或变量我们”。我该如何解决这个问题?
  • 啊,现在我得到了一个未定义的 user_stock 方法。我以前也遇到过这个问题。我可以知道如何解决这个问题吗?我认为这与我的关联设置或外键引用有关? (我已经正确设置了 afaik)
  • 你用user.user_stock代替复数user.user_stocks吗?
  • 又是我的错字 - 应该是 user_stock.stock。该睡觉了。
猜你喜欢
  • 2018-07-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
相关资源
最近更新 更多