我有几个模型如下所示,我使用Thing
中的搜索类方法来过滤记录
class Category << ActiveRecord::Base
has_many :thing
end
class Thing << ActiveRecord::Base
belongs_to :category
:scope approved -> { where("approved = true") }
def self.search(query)
search_condition = "%" + query + "%"
approved.where('name LIKE ?', search_condition)
end
end
它在我的物品控制器中工作正常。索引路线如下:
def index
if params[:search].present?
@things = Thing.search(params[:seach])
else
@thing = Thing.all
end
end
在类别显示路线上,我显示此类别的东西。我也有搜索表单在类别中搜索。
def show
@category = Categories.find(params[:id])
if params[:search].present?
@category.things = @category.things.search()
end
end
所以当我在category_id
路由中使用搜索类方法时,问题是所有已过滤事物的nil
属性都设置为categories#show
。为什么将它保存到数据库?我想我必须为此致电@category.save
或update_attribute
。我还很擅长使用rails,所以我确信它很容易被忽视或误读。
我目前的解决方案是将if语句移动到视图中。但是现在我试图添加带有kaminiri的页面并且它变得更加丑陋。
<% if params[:search].present? %>
<% @category.things.search(params[:search]) do |thing| %>
... Show the filtered things!
<% end %>
<% else %>
<% @category.things do |thing| %>
... Show all the things!
<% end %>
<% end %>
我想到的另一个解决方案是使用@things = @categories.things.search(params[:search])
,但这意味着我将重复的内容传递给视图。
答案 0 :(得分:1)
看看Rails guide。 has_many
关联在collection=(objects)
也属于的模型上创建了许多方法。根据指南:
collection =方法使集合仅包含提供的集合 对象,通过适当添加和删除。
在您的示例中,您实际上是使用thing
将找到的所有@category.things.search()
分配给先前使用Category
查询的Categories.find(params[:id])
。
答案 1 :(得分:0)
像Yan说的那样,&#34;在你的例子中,你实际上是将使用@ category.things.search()发现的所有东西分配给之前使用Categories.find(params [:id])查询的类别。 &#34 ;.验证将解决此问题。
由于您的模型没有验证,因此记录将保存为零。阅读有关活动记录validations的信息。 这是他们提供的例子。您也希望验证状态,因为正在创建没有值的记录。
class Person < ActiveRecord::Base
validates :name, presence: true
end
Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false