Rails 4:在没有数据库保存的情况下分配记录“有很多”属性

时间:2015-02-02 20:44:16

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

我有几个模型如下所示,我使用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.saveupdate_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]),但这意味着我将重复的内容传递给视图。

2 个答案:

答案 0 :(得分:1)

看看Rails guidehas_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