1

我在我的 Rails 应用程序中构建了一个查找表。

它是一个存储下拉选择器或可能的复选框的查找文本值的表。我希望查找表具有关联的视图,以便可以轻松编辑值。将来我可能还想在单个字段的多个模型之间共享查找值。

到目前为止,我已经设法让它用于选择值,但是在显示或索引视图上再次显示文本值是有问题的。

这就是我构建查找表的方式

rails g scaffold Lookup field_name lookup_text table_name note

在对字段进行查找的 edit.html.erb 中,我有这样的代码,它可以工作并允许我从列表中进行选择。

<div class="field">
    <%= f.label :status %><br />
    <%= f.collection_select :status, Lookup.find(:all,:conditions => ["table_name = 'course' and field_name = 'status'"]), :id, :lookup_text, include_blank: true,:prompt => "Status" %>
</div>

这一切都很好。当我尝试将其显示回来时,我找不到正确的语法。我发现的最好的是:(在控制器中)

@status = Lookup.where(:id => @course.status).pluck(:lookup_text)

(在视图中)

<p>
  <b>Status:</b>
  <%= @status %>
</p>

我想我得到了整个对象。它显示如下:

状态:[“活动”]

我的问题是:(1)我如何只显示值?(2)这是最好的方法吗?

我已经查看了这些和其他 SO 问题,但没有一个是我真正想要的:

带有查找表的 Rails 多态

在 Rails 中实现查找表

编辑 好的,这可行,但看起来它不是正确的解决方案。有没有人有更好的方法来做到这一点?

@status = Lookup.where(:id => @course.status).pluck(:lookup_text)[0]
4

1 回答 1

1

显示价值的另一种方式是@status = Lookup.find(@course.status).lookup_text

为什么不尝试使用类进行不同的查找:

class CourseStatus < ActiveRecord::Base
  set_table_name "lookups"
  default_scope where("table_name = 'course' and field_name = 'status'")
end

class Course
  belongs_to :course_status
end

然后你可以使用:

CourseStatus.all # e.g. to fill select options
Course.first.course_status.lookup_text # => "Active" or smth else

或没有课程:

class Lookup
  def self._by_table_and_field(table, field)
    ['table_name = ? and field_name = ?', table, field]
  end

  scope :by_table_and_field, lambda { |table, field| 
    where(Lookup._by_table_and_field(table, field))
  }
end

class Course
  belongs_to :status, class_name: 'Lookup', conditions: Lookup._by_table_and_field('course', 'status')
end

Lookup.by_table_and_field('course', 'status').all
Course.first.status.lookup_text
于 2012-10-25T15:11:04.740 回答