【问题标题】:Choosing a specific row in a table in rails在rails中的表中选择特定行
【发布时间】:2015-02-20 22:47:14
【问题描述】:

我有一个迁移和模型,其中包含一个名为药物的表。我需要从药物表中选择一个特定的行。我也在尝试过滤掉所有没有当前用户 ID 的药物。

这是我当前的代码。

Medication.find(:name, :conditions => { :user_id => current_user.id }, :order => "Medication.name")

我知道这并不完整,但我们将不胜感激。

【问题讨论】:

  • 我说我想过滤掉没有当前用户 ID 的药物。双重否定。
  • 我使用的是 Rails 版本 4
  • 您要为给定的 user_id 或 特定行 选择 所有 药物吗?规格是什么?最新的?带有特定的id?
  • 我只想选择一个用作标题,我希望能够指定它发现用于多个标题的第一个或 x 结果

标签: ruby-on-rails ruby ruby-on-rails-4 model rails-activerecord


【解决方案1】:

您可以像这样为特定的 user_id 加载第一个药物(假设您的药物表有一个 user_id):

Medication.where(:user_id => current_user.id).order(:name).first

如果我们的User 模型有一个belongs_to :medications,它可以简化为:

current_user.medications.order(:name).first

如果你想加载例如第 5 种药物只需添加 4 的偏移量:

current_user.medications.order(:name).offest(4).first

或加载所有药物并遍历它们:

current_user.medications.limit(10).each do |medication|
  puts medication.name
end

如果您想在网站上输出前十种药物,您可以执行以下操作:

# in the controller
@medications = current_user.medications.order(:name).limit(10)

# in the view
<ul>
  <% @medications.each do |medication| %>
    <li><%= medication.name %></li>
  < end %>
</ul>

您使用的查找器语法已被弃用,并在 Rails 4 中被替换。请参阅 Rails Guide about querying the database

【讨论】:

  • 这太棒了,但我怎么能做到第二个、第三个或第 50 个结果呢?
  • 很抱歉再次打扰您,但这只是需要再进行一次调整,但我遇到了麻烦。这会输出一些奇怪的文本,因为它输出的是药物,而不是名称。看起来像这样……i.imgur.com/LWcGgj1.png
  • 非常感谢您一直以来的帮助,像您这样的人使堆栈溢出很棒。它仍然不太奏效,新方法显示所有药物,而不仅仅是特定结果。
【解决方案2】:

如果您尚未设置 has_many :through 关联,这是一个完美的用例。

class User < ActiveRecord::Base
  has_many :prescriptions # or whatever
  has_many :medications, :through => :prescriptions
end

class Prescription < ActiveRecord::Base
  belongs_to :user
  belongs_to :medication
end

class Medication < ActiveRecord::Base
  has_many :prescriptions
  has_many :users, :through => :prescriptions
end

现在您可以使用@user.medications 仅检索该用户的药物、@user.medications.find(params[:medication_id] 在用户分配的药物中查找特定药物、@user.medications &lt;&lt; Medication.find_by(name: 'Aspirin') 向用户添加药物等操作。

这是对这项技术的基本概述,但它是一个基本的 Rails 概念,因此有大量关于用例的信息,与您可能尝试做的任何事情都很接近。

【讨论】:

  • 这仍然只是输出一整行,而不是其中的一部分。
  • 我没有包含任何视图行为,它没有输出任何东西。如果你只想要名字,你可以像平常一样使用'@medication.name'
【解决方案3】:

我解决了这个问题,我决定发布答案,以防其他人似乎有类似的问题。

我最终没有在我的控制器中放入任何东西,也没有在我的模型中添加任何新东西。我只是在视图中使用了这行代码。

<%= Medication.offset(0).where(:user_id => current_user.id).pluck(:name).first %>

没有各位发帖者的支持,我是做不到的,谢谢!

【讨论】:

  • 这比你描述的更具体。
  • 可以写成&lt;%= current_user.medications.first.name %&gt;
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多