搜索喜欢?只有满足一定要求?

时间:2011-12-10 01:40:32

标签: ruby-on-rails ruby ruby-on-rails-3

如果关闭,请原谅我的任何术语。在我的模型中,我试图定义一个搜索2列的方法,除非另一列(布尔值)为真。

class BusinessStore < ActiveRecord::Base
  attr_accessible :business_name, :address, :online_store, :website

  def store
    "#{business_name} - #{address}" 
  end
end

:business_name是一个虚拟属性,:online_store是一个布尔列。

我想采用:online_store并制作一个这样的方法:

def store
 "#{business_name} - #{address}" unless business_store.online_store = true
end

所以它不应该显示因在线商店被标记为真的商店因为我只在寻找零售商店;有地址的商店。这是我的模型控制器。为了再次澄清,BusinessStore.where应该省略使用online_store = true

搜索商店
class BusinessStoresController < ApplicationController

  def index
    @business_stores = BusinessStore.all
    @business_stores = BusinessStore.where("address like ?", "%#{params[:q]}%")

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @business_stores }
      format.json { render :json => @business_stores.collect{|b|{:id => b.id, :name => b.store } } }
    end
  end
end

这不起作用,因为我的business_stores.json得到一个NameError:

http://localhost:3000/business_stores.json
NameError in BusinessStoresController#index

undefined local variable or method `business_store' for...

你如何定义这个?

1 个答案:

答案 0 :(得分:2)

你有点想要我认为的两件事。如果要获取online_store != true所在的所有实体存储,则可以为其定义范围。

class BusinessStore < ActiveRecord::Base
  attr_accessible :business_name, :address, :online_store, :website
  scope :stores, where(:online_store => false)
  # or alternately
  scope :alternate_stores, where("online_store IS NOT NULL")
  # depending on default values
end

然而,这并不是从where()方法中排除它。您可能会重载该方法,但我不认为这种情况需要这种方法。

def store
  "#{business_name} - #{address}" unless business_store.online_store = true
end

上面的代码工作得很好,如果那就是你想要的(看看我的意思是要求两件事?)。您只需将其更改为

即可
"#{business_name} - #{address}" unless self.online_store == true

您看到的错误是因为您没有名为business_store的对象,您应该访问该对象本身的变量。你需要double =,否则你实际上是将变量设置为true,这在Ruby中也是如此,在if / unless中也是如此。