Rails app,产品,类别和品牌之间的关系?

时间:2018-01-23 16:43:10

标签: ruby-on-rails

抱歉打扰你的基本问题。我建立了一个像电子商务电子商务的应用程序。我有3个模型:product, category and brand。在控制器上是一团糟但正在工作。在左侧,我有2 each.do list,一个用于category,另一个用于brand。在页面的其余部分,我有products。当我选择TV category时,它会给我所有tv这是好的(它在http://localhost:3000/**categories**/8页面上),当我选择让我们说LG品牌它给我时所有LG : Tv , Phones....etc.(它都在http://localhost:3000/**brands**/6页面上),我只想要所有LG电视。我相信我的问题来自于受孕,所以我从一开始就弄得一团糟。

类别模型:

has_many :products, dependent: :destroy 
has_many :brands

产品型号:

belongs_to :category  
belongs_to :brand

品牌型号:

has_many :products   
belongs_to :category

你能给我一个建议,如何开始构建这个正确的(只是一个大纲),或者告诉我你正在使用什么样的宝石。我不知道我的问题是来自关系还是过滤。

谢谢大家。

2 个答案:

答案 0 :(得分:0)

您的主要问题是品牌和类别之间的关系。这是多对多而不是一对多。

品牌型号:

has_many :products
has_many :categories, through: products

类别模型:

has_many :products
has_many :brands, through: productions

产品型号:

belongs_to :brand
belongs_to :category

答案 1 :(得分:0)

当您点击类别链接时,您正在调用此类别的show方法。当您点击某个品牌时,您正在调用此品牌的show方法。两种show方法都列出了类别(或品牌)的所有产品,但不记得以前的过滤器(品牌或类别)。您的类别或品牌链接也应传递已过滤的品牌或类别。您可以通过在show方法中定义两个实例变量来实现:

CategoriesController

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.app.app">
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-feature android:name="android.hardware.nfc" android:required="false"/>
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"
        tools:ignore="ProtectedPermissions" />
    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".timer.UploadService"
            android:enabled="true"
            android:exported="true">
        </service>
        <service
            android:name=".services.uploaddata.ui.UploadDataService"
            android:enabled="true"
            android:exported="true">
        </service>
        <activity android:name=".main.ui.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:launchMode="singleTask"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".p1.ui.class1"
            android:label="@string/title_activity_class1"
            android:screenOrientation="portrait"
            android:launchMode="singleTask">
        </activity>
        <activity
            android:name=".p2.ui.class2"
            android:label="@string/title_activity_class2"
            android:screenOrientation="portrait"
            android:theme="@style/class2ActivityTheme"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
        <activity
            android:name=".p3.ui.class3"
            android:theme="@style/AppTheme.ActionBar"
            android:label="@string/title_activity_class3"
            android:screenOrientation="portrait">
        </activity>
        <activity
            android:name=".p4.ui.class4"
            android:label="@string/title_activity_class4"
            android:theme="@style/AppTheme.ActionBar"
            android:screenOrientation="portrait">
        </activity>
        <activity
            android:name=".p5.ui.class5"
            android:label="@string/title_activity_class5"
            android:screenOrientation="portrait">
        </activity>
    </application>
</manifest>

BrandsController几乎相同,按category_id过滤:@cat

然后,在链接中:

def show
  @brand = params[:brand]
  @cat = params[:cat]
  #find the category or brand to show as usual. 
  @category = Category.find_by(id: params[:id])

  products = @category.products.where(brand_id: @brand)

end

品牌链接相同

修改

你也必须像肖恩所说的那样改变模特。