我在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 Polymorphic with Lookup Table
Implementing a lookup table in Rails
修改 好的,这有效,但它看起来不是正确的解决方案。有人有更好的方法吗?
@status = Lookup.where(:id => @course.status).pluck(:lookup_text)[0]
答案 0 :(得分: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