如果关闭,请原谅我的任何术语。在我的模型中,我试图定义一个搜索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...
你如何定义这个?
答案 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中也是如此。