Nek*_*eko 3 ruby ruby-on-rails
我正在搞乱测试/练习项目,只是为了更好地理解Rails.
在我的情况下,我有三个模型:商店,用户和产品.
商店可以有三种类型:基本,中等,大型.基本最多可以有10个产品,中等50个,大100个.
我正在尝试验证这种数据,Shop的类型,并检查它在创建新产品时拥有多少产品.
到目前为止,我想出了这个代码(在shop.rb中),但它不起作用:
def lol
account = Shop.find_by_sql "SELECT account FROM shops WHERE user_id = 4 LIMIT 1"
products = Product.count_by_sql "SELECT COUNT(*) FROM products WHERE shop_id = 13"
if account = 1 && products >= 10
raise "message"
elsif account = 2 && products >= 50
raise "message"
else account = 3 && products >= 100
raise "message"
end
end
Run Code Online (Sandbox Code Playgroud)
我甚至不知道我的解决方案背后的逻辑是正确的还是什么.也许我应该验证使用
has_many
Run Code Online (Sandbox Code Playgroud)
和它的"大小"方法?我不知道.:)
至少account = 1改为account == 1.这同样适用于account = 2和account = 3.
除此之外,我建议你看看Rails指南,以了解使用Rails.
话虽如此,我建议这样的事情:
class Shop < ActiveRecord::Base
has_many :products
validates :products_within_limit
# Instead of the 'account' column, you could make a 'max_size' column.
# Then you can simply do:
def products_within_limit
if products.size > max_size
errors.add_to_base("Shop cannot own more products than its limit")
end
end
def is_basic?
products.size >= 10 && products.size < 50
end
def is_medium?
products.size >= 50 && products.size < 100
end
def is_big?
products.size >= 100
end
def shop_size
if self.is_basic?
'basic'
elsif self.is_medium?
'medium'
elsif self.is_big?
'big'
end
end
end
Run Code Online (Sandbox Code Playgroud)
这允许你这样做:
# Get shop with id = 1
shop = Shop.find(1)
# Suppose shop '1' has 18 products:
shop.is_big? # output false
shop.is_medium? # output false
shop.is_basic? # output true
shop.shop_size # output 'basic'
Run Code Online (Sandbox Code Playgroud)