【问题标题】:How do I write this conditional statement for a nested resource in rails?如何为 Rails 中的嵌套资源编写此条件语句?
【发布时间】:2021-05-21 09:35:15
【问题描述】:

我有三个模型:用户投票 PollItem 投票

一个用户有很多投票和投票

投票有很多投票项目(嵌套属性),属于用户

投票项有很多票,属于投票

投票属于投票项和用户

我已经制作了一个投票功能,用户可以在其中投票/取消投票项目。现在,我正在尝试编写一个条件语句,以便用户能够对投票中的投票项目进行投票。例如,如果已经为投票中的第一个投票项目记录了投票,那么我希望在投票中的其他投票项目上禁用投票链接,除了已投票的投票项目。

<% if current_user.votes.where(poll: @poll).count > 0 %>
    display vote link
<% else %>
    remove vote link
<% end %>

但我得到了错误 SQLite3::SQLException: 没有这样的列: votes.poll_id

请也为问题提出一个更好的标题。

编辑:

按照@lam 的建议,我将语句调整为

<% if user_signed_in? && Vote.where(user_id: current_user.id).where(poll_item_id: @poll.poll_items.pluck(:id)).count > 0 %>
    <p>You have voted</p>
    <%= link_to "Unvote", poll_poll_item_vote_path(@poll, @poll_item), method: :delete %>
<% else %>
    <%= link_to "Vote", poll_poll_item_vote_path(@poll, @poll_item), method: :post %>
<% end %>

但是,该操作已对投票中的所有投票项目执行。当我对一个投票项目进行投票时,其他投票项目的投票链接发生了变化,而不是投票项目。

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    如果Votes belong to poll item and User,那么投票应该是poll_item_id,而不是poll_id。所以我猜逻辑是这样的:

    <% if user_signed_in? && Vote.where(user_id: current_user.id, poll_item_id: @poll_item.id).count > 0 %>
        <p>You have voted</p>
        <%= link_to "Unvote", poll_poll_item_vote_path(@poll, @poll_item), method: :delete %>
    <% else %>
        <%= link_to "Vote", poll_poll_item_vote_path(@poll, @poll_item), method: :post %>
    <% end %>
    

    【讨论】:

    • 感谢您的贡献。但是,该操作是对轮询中的所有轮询项目执行的。当我点击“投票”时,项目上的所有投票链接都变为“取消投票”,而不是已投票的链接。我已经更新了这个问题的详细信息,请检查。
    • @TolaseAdegbite,如果您对poll 中的任何poll item 进行了投票,那么您希望poll 中的所有poll item 都显示“取消投票”?
    • 不,我只希望已投票的投票项目显示“取消投票”,但在目前的情况下,对投票项目中的投票项目进行投票会将其他“投票”链接更改为“取消投票”。如果您需要我显示更多代码,请告诉我。
    • @TolaseAdegbite 我更新了我的答案,但我建议您阅读并练习本指南:guides.rubyonrails.org/active_record_querying.html
    猜你喜欢
    • 2023-03-06
    • 2023-02-13
    • 2013-08-04
    • 2020-05-09
    • 1970-01-01
    • 2021-06-25
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多