【问题标题】:Rails validation In attribute tableRails 验证在属性表中
【发布时间】:2018-05-17 00:42:53
【问题描述】:

我是 ROR 的新手。
我正在构建一个分类广告应用程序,我的数据库中有以下表格:
(为简单起见,删除了一些字段)

表格用户

此表存储所有用户。

user_id
名称
电子邮件
密码

桌面广告

此表存储所有广告。

ad_id
users_user_id (FK)
标题
描述
cat_id (FK)
created_at

样本数据:

 ------------------------------------------------------------------------------
|  ad_id  |  users_user_id  |  title    |  desc        |  cat_id  | created_at |
------------------------------------------------------------------------------
|    1    |       1         |  iphone 4 |  brand new   |    2     | 30-11-2015 |
 ------------------------------------------------------------------------------

表格类别

此表存储所有可用的类别。 ads 表中的 cat_id 与该表中的 cat_id 相关。

cat_id
类别
parent_cid

样本数据:

-------------------------------------------
|cat_id| category            | parent_cid |
-------------------------------------------
|1     | Electronics         | NULL       |
|2     | Mobile Phone        | 1          |
|3     | Apartments          | NULL       |
|4     | Apartments - Sale   | 3          |
-------------------------------------------

表格 ads_attribute

此表包含特定类别的所有可用属性。与类别表相关。

attr_id
cat_id (FK)
attr_label
attr_name

样本数据:

-----------------------------------------------------------
|attr_id | cat_id | attr_label       | attr_name          |
-----------------------------------------------------------
|1       | 2      | Operating System | Operating_System   |
|2       | 2      | Is Touch Screen  | Touch_Screen       |
|3       | 2      | Manufacturer     | Manufacturer       |
|4       | 3      | Bedrooms         | Bedrooms           |
|5       | 3      | Total Area       | Area               |
|6       | 3      | Posted By        | Posted_By          |
-----------------------------------------------------------

表格 ads_attr_value

此表存储ads表中每个广告的属性值。

attr_val_id
attr_id (FK)
ad_id
attr_val

样本数据:

---------------------------------------------
|attr_val_id | attr_id | ad_id | attr_val   |
---------------------------------------------
|1           | 1       | 1     | Ios 8      |
|2           | 2       | 1     | 1          |
|3           | 3       | 1     | Apple      |
---------------------------------------------


在将数据存储在 ads_attr_value 表中之前验证数据的最佳方法(rails 方法)是什么,因为这些值将位于选择字段中并且用户可以轻松更改它们,例如从 Ios 8 到“废话”。 我曾考虑将每个属性的所有可能值存储在一个新表中,然后检查用户发送的值是否存在于该表中,然后再将其存储在 ads_attr_value 中。你怎么看?我相信有更好的方法。
感谢分享。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    rails 方式可能会定义您与 ActiveRecord 关联的关系:http://guides.rubyonrails.org/association_basics.html

    因此您可以轻松地在模型上定义

    class AdsAttrVal < ActiveRecord::Base
        belongs_to :ad
        validates :ad, presence: true
    end
    

    但是请记住,Rails 存储表 ID 的方式是将其命名为“id”,而不是像您所做的那样命名为“model_id”(“user_id”、“id”) .我的例子假设 Rails 方式受到尊重......

    【讨论】:

    • 我想你没有理解我的问题,例如我如何在将操作系统存储到数据库之前验证它属于“Ios 8”或“Ios 9”或“android”,这只是电子类别属性,汽车类别呢?它也有属性如何验证用户没有弄乱表单并更改了选择标签中的值
    • 我知道 rails 关联,并且我知道 rails 使用 id 作为约定来代替 user_id,但我看不到如何在存储数据之前验证数据,或者至少我可以'不知道如何使用这个数据库方案来做到这一点
    • 确实,我误解了这个问题。但是,我不确定您的表单是如何工作的。您可以轻松地使用选择标签来显示“ios 8”,同时将相应的 ads_attr_value_id 发送到您的控制器。因此,您可以使用允许的操作系统播种您的基础并仅将 id => 传递给您的程序,因此没有“blabla”的风险
    【解决方案2】:

    您必须在 &lt;yourModel&gt;.rb (模型文件) 中指定您想要的验证。例如,如果要验证 ad_id 是否为数字,则应在 validates 语句中添加数值参数,见下文:

    class AdsAttrValue < ActiveRecord::Base
      validates :ad_id, numericality: true
    
      #validate if add_att_value has the permitted values
      validate :myCustomValidation
    
      def myCustomValidation
        #your logic of validation goes here
        #you can access here all the fields from this object recently created
        if attr_val == something
           #do something
        end
      end
    
    end
    

    看到来自 rails 的验证在末尾有一个 s (validates),而您自己的书面验证没有 (validate)。 在存储到数据库之前创建对象时执行此验证,以查看它是否符合验证并且不存储它不符合。您可以在自己的验证中添加错误,让用户知道出了什么问题。用this reading of validations in ruby on rails走得更远

    【讨论】:

      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多